일반적으로 Firestore에서 데이터를 가져오려면 다음과 같은 단계가 필요하다.
아래 코드에서는 특정 게시글 목록을 가져오는 과정을 보여준다.
class CommunityDao {
// 게시글 목록을 가져온다.
suspend fun getContentList(contentType: Int): MutableLiveData<List<CommunityViewModel>> {
// 게시글 정보를 담을 MutableLiveData
val resultLiveData = MutableLiveData<List<CommunityViewModel>>()
val job1 = CoroutineScope(Dispatchers.IO).launch {
// Firebase 초기화
Firebase.initializeApp(context)
// Firestore에 접근할 수 있는 Firestore 인스턴스 가져오기
val firestore = Firebase.firestore
// 컬렉션에 접근할 수 있는 Firestore 컬렉션 참조 가져오기
val collectionReference = firestore.collection("posts")
// Query 생성
val query = collectionReference.whereEqualTo("contentType", contentType)
// 쿼리 실행
query.get().addOnSuccessListener { documents ->
val postList = mutableListOf<CommunityViewModel>()
for (document in documents) {
// Firestore 문서에서 데이터를 가져와서 CommunityViewModel에 매핑하고 postList에 추가합니다.
val communityViewModel = document.toObject(CommunityViewModel::class.java)
postList.add(communityViewModel)
}
// MutableLiveData에 게시글 목록 설정
resultLiveData.postValue(postList)
}.addOnFailureListener { exception ->
// 쿼리 실패 처리
}
}
// 결과 MutableLiveData 반환
return resultLiveData
}
}
whereEqualTo 메서드는 특정 필드의 값이 지정된 값과 동일한 문서만 가져오는 쿼리를 만든다. whereEqualTo(”필드명”, 변수명) 형태이다.
ex) whereEqualTo(”contentType”, contentType) 일 경우, "contentType" 필드가 주어진 변수 값과 같은 문서만을 가져온다.
query.get() 메서드를 실행하면 QuerySnapshot 객체가 반환된다. QuerySnapshot은 Firestore 쿼리의 결과를 담고 있는 컨테이너로, 쿼리의 결과로 선택된 모든 문서를 포함한다.
forEach를 통해 문서를 순회하면서 각 문서를 처리할 수 있다. QuerySnapshot은 아래 예시와 같이 forEach 메서드를 제공한다
// 각 문서를 CommunityViewModel 객체로 변환 후 리스트에 추가
querySnapshot.forEach { document ->
val communityViewModel = document.toObject(CommunityViewModel::class.java)
postList.add(communityViewModel)
}
QuerySnapShot은 클래스인데, 직접적으로 객체를 생성할 수는 없다. Firestore 에서 쿼리를 실행하여 반환되는 결과를 담는 클래스이기 때문이다.
따라서 var querySnapshow = QuerySnapshot()과 같이 직접 생성하는 것은 불가능하다. 대신, 쿼리를 생성하고 나면 그 결과로 생성된다.
여기서 posts는 실제 firebase에 정의한 컬렉션 이름이다.
val collectionReference = Firebase.firestore.collection("posts")
val query = collectionReference.whereEqualTo("contentType", contentType)
Firestore 쿼리 결과가 QuerySnapshot 객체에 저장되기 때문에, 개별 문서에 접근하기 위해 forEach를 사용하여 반복 처리한다.
forEach를 통해 각 문서를 순회하면서 원하는 처리를 할 수 있으며, 이 과정에서 문서 데이터를 변환해 리스트에 추가하는 등의 작업이 가능하다. 또한, 쿼리 결과의 문서를 효율적으로 처리하고, 필요한 데이터만을 선별하여 이용할 수 있게 해준다.
whereGreaterThan(): 지정된 필드의 값이 주어진 값보다 큰 문서를 반환합니다.
whereLessThan(): 지정된 필드의 값이 주어진 값보다 작은 문서를 반환합니다.
whereGreaterThanOrEqualTo(): 지정된 필드의 값이 주어진 값보다 크거나 같은 문서를 반환합니다.
whereLessThanOrEqualTo(): 지정된 필드의 값이 주어진 값보다 작거나 같은 문서를 반환합니다.
orderBy(): 결과를 지정된 필드의 값에 따라 정렬합니다.
limit(): 반환되는 결과 수를 제한합니다.
startAt(): 결과를 지정된 값 이후의 값으로 시작합니다.
startAfter(): 결과를 지정된 값 이후의 값 다음으로 시작합니다.
endAt(): 결과를 지정된 값 이전의 값으로 끝냅니다.
endBefore(): 결과를 지정된 값 이전의 값 전에 끝냅니다.
whereArrayContains(): 지정된 필드가 제공된 값과 동일한 배열을 포함하는 문서를 반환합니다. 이 메서드는 배열 필드에서 사용됩니다.
fireStore에 접근해서 데이터를 가져오는 흐름은 다음과 같다.