마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Firestore에서 데이터 가져오기

0 추천

사진에서 보이는것 처럼 제일 오른쪽 필드에 해당하는 key들의 value 값을 가지고 와야하는데 어떻게해야할지 도저히 모르겠네요 ㅠㅠㅠ

mjsky97 (140 포인트) 님이 2020년 12월 13일 질문

1개의 답변

0 추천

웹 버전으로는 CRUD를 해보긴 했는데요, 안드로이드도 API는 같으리라 생각합니다. 같은 Firebase Query API를 사용하는 거니까요.

const firestore = //파이어스토어 인스턴스를 가져오는 코드를 여기에.
const keywordsCollection = firestore.collection("keywords")
keywordsCollection.doc("1971연탄구이").get()
.forEach(function(item){
           //필요한 처리
        });

 

자바스크립트 코드이긴 하지만 자바랑 별반 다를게 없을 겁니다.  FireStore은 기본구조가 document와 collection의 tree 구조입니다. 모든 자료는 document이거나 collection이며, collection은 document의 리스트라고 보시면 됩니다. doument안에는 다른 document나 collection이 들어갈 수 있습니다. collection은 document의 리스트라고 생각하시면 되구요. 따라서 최상위에 있는 keywords가  collection이므로 collection으로 접근해서 가져온 다음,  "1971연탄구이"는 키값이 "19871연탄구이"인 document이므로, doc("1971연탄구이")로 접근해서 가져오시면 됩니다.

그리고 전체 메뉴리스트에 대해 작업을 하시려면,  keywordCollection의 snapshot 속성이 있을 텐데, 거기에 콜백을 호출하셔 처리하시면 됩니다.

파이어스토어에 안드로이드 예제가 있어서 가져왔습니다. 아래처럼 사용하시면, 전체 메뉴리스트를 가져올 수 있을 것 같네요.

List<RestaurantMenu> restaurantMenus = new ArrayList<>();

ApiFuture<QuerySnapshot> future = db.collection("keywords").get();
List<QueryDocumentSnapshot> documents = future.get().getDocuments();
for (QueryDocumentSnapshot document : documents) {
     restaurantMenus.add(document.toObject(RestaurantMenu.class)));
}

doSomethingWith(restaurantMenus);


public class RestaurantMenu {
    // 파이어스토어 필드에 해당하는 멤버들 추가
    private final boolean costEfficient;  // 가성비최고  
    private final boolean simpleMeal;   //간단한 식사
    private final boolean occupied;  //객석있는 자리
   
    // 생성자 생략
    // getter 생략
}

 위처럼 하면, keywords collection을 가져올 수 있고, 그 안에는 메뉴 document들이 존재하므로 collection을 루프를 돌면서 각각의 document를 toObject를 호출하여 님이 필요한 오브젝트로 변환해주는 겁니다.

그런데, toObject 를 호출할 때 님의 파이어스토어 필드들은 한글이라 toObject을 바로는 못쓰고 get(fieldname)으로 해서 필드를 하나하나 맵핑해주어야 할 것처럼 보이네요. 파이어스토어 문서를 정독하시기를 권장드려요.

spark (227,470 포인트) 님이 2020년 12월 13일 답변
https://github.com/firebase/firebase-android-sdk/blob/master/firebase-firestore/src/main/java/com/google/firebase/firestore/util/CustomClassMapper.java

이미 해당 라이브러리에 CustomClassMapper가 존재하네요. 이걸 이용하시면 될 것 같은데요.
...