jun lee
10
2021-07-29 13:24:52
0
62

firebase firestore에서 data read를 구현하는 method에서 문제가 있습니다.


안녕하세요. 

firebase를 통해서 간단한 게시판 어플을 만들어보려고 하는 대학생입니다.

firebase firestore 사용을 위한 코드를 짜는 도중에 문제가 생겨서 이렇게 질문 드립니다.

DataIn contentlistdataIn = (String title, String time, String data_id, ArrayList<String> url_list)->{
        ContentsListData temp = new ContentsListData(title, time, data_id);
        return temp;
    };

    public ArrayList<Data> List = new ArrayList<>();

    public ArrayList<Data> readData(String dataPath, String field, int count, String dataType){

        CollectionReference ref = db.collection(dataPath);
        ref.orderBy(field, Query.Direction.DESCENDING).limit(count);
        ref.get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if(task.isSuccessful()){
                            for (QueryDocumentSnapshot document : task.getResult()){
                                Log.d(TAG, document.getId() + " => " + document.getData());

                                if(dataType.equals("content")){

                                } else if(dataType.equals("contents_list")){
                                    try {
                                        Data temp = contentlistdataIn.dataIn(
                                                document.getData().get("title").toString(),
                                                document.getData().get("time").toString(),
                                                document.getData().get("data_id").toString(), null);

                                        List.add(temp);

                                    } catch (Exception e){
                                        e.printStackTrace();
                                    }
                                } else{

                                }
                            }
                        } else {
                            Log.d(TAG, "Error getting documents: ", task.getException());
                        }
                    }
                });
        return List;
    }

readData method는 firestore에서 데이터를 가져와서 제가 만든 포맷으로 바꾸어 return하도록 의도한 method입니다. " List.add(temp); " 부분에서는 ArrayList<Data> List에 데이터가 잘 추가된 것을 확인할 수 있었습니다만 method가 return을 하는 값은 이상하게도 null 값을 return합니다. 

 확인해보니 Oncomplete metod의 내부 코드가 가장 나중에 실행되는 것을 확인 할 수 있었습니다. 이를 검색해 본 후에 firestore asynchronous와 관련된 문제인 것 같다고 판단하여 onComplete method와 return 부분을 mutex lock을 통하여 제가 원하는 순서대로(윗줄부터 아랫줄 방향으로) 실행되도록 해보려 했으나 return 부분에서 mutex lock이 acquire를 하지 못하였습니다.

해결방법이 없을까하여 이렇게 질문 드립니다.

긴글 읽어 주셔서 감사합니다.

0
  • 답변 0

  • 로그인을 하시면 답변을 등록할 수 있습니다.