2017-10-15 6 views
5

나는Firebase Firestore Reference 데이터 유형을 쿼리하는 방법은 무엇입니까?

사용자 참조

enter image description here

사용자 컬렉션을 아래의 스크린 샷과 같이 사용자에 대한 참조를 저장하는 경우 FireStore reference 데이터 형식을 사용하고

enter image description here

이 데이터를 쿼리하려고하면 ClassCastException이 표시됩니다 (이 때문에 String으로 캐스팅을 시도했습니다).

코드

//.. this function reads data from DocumentSnapshot 
//.. and converts to an Organization 
private fun DocumentSnapshot.toOrganization(): Organization { 
    //.. some code 
     (this.data["members"] as ArrayList<HashMap<String, Any>>).map { toOrgMember(it) }) 
    //.. more code 
} 

fun toOrgMember(map: Map<String, Any>): OrgMember { 
    //map["user"] as String throws ClassCastException. Refer first screenshot 
    return OrgMember(map["id"] as Long, UserRef(map["user"] as String), map["type"] as String, 
     asJobTitlesList(map["jobTitles"] as String)) 
} 

스택 트레이스 어떤 클래스 I는 참조 데이터 유형을 캐스팅해야하기

10-14 20:31:17.503 15569-15569/com.a.b W/System.err: Caused by: java.lang.ClassCastException: com.google.android.gms.internal.zzegf cannot be cast to java.lang.String 
10-14 20:31:17.504 15569-15569/com.a.b W/System.err:  at feature.model.core.CoreUtilsKt.toOrgMember(CoreUtils.kt:28) 
10-14 20:31:17.504 15569-15569/com.a.b W/System.err:  at feature.model.organization.OrgRemoteKt.toOrganization(OrgRemote.kt:55) 

? (com.google.android.gms.internal.zzegf은 사용할 수없는 내부 클래스처럼 보입니다)

현재로서는 참조 유형으로 docs에서 예제를 찾지 못했습니다. 도움이 될 것입니다.

답변

1

답변을 제공하기 위해 일부 코드를 참조해야합니다. 그 동안 여기에 내 쿼리 스 니펫이 어떻게 생겼는지, 결과를 반복 할 수없는 경우 고유 한 무언가를 찾고 있다고 가정합니다.

FireBaseFirestore db = FirebaseFirestore.getInstance(); 
collectionRef = db.collection("yourCollection"); 
Query query = collectionRef.whereEqualTo("Field", "yourQuery"); 
query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { 
         @Override 
         public void onComplete(@NonNull Task<QuerySnapshot> task) { 
          if(task.isSuccessful()) { 
           QuerySnapshot qSnap = task.getResult(); 
           if (!qSnap.isEmpty()) { 
            Log.d("Query Data", String.valueOf(task.getResult().getDocuments().get(0).getData()));          
           } else { 
            Log.d("Query Data", "Data is not valid"); 

           } 

          } 
         } 
        }); 
+0

내가 요청한대로 코드를 추가했습니다. 희망이 도움이됩니다. –

2

Firestore는 컬렉션에서 참조를 가져올 때 DocumentReference를 반환합니다. 캐스트를 DocumentReference로 변경해도 작동하지 않는 경우 issue을 추적하십시오.

+0

예 .. DocumentReference에 캐스팅도 실패했습니다. 당신이 맞고 이것이 버그 인 것 같습니다. –

1

동일한 문제가 발생합니다. 그러나이 문제는 다음을 사용하여 해결할 수 있습니다.

DocumentReference docRef = firestore.document(map.get("reference_field").toString()); 

정확한 방법이지만이 방법은 저에게 효과적입니다.

- 업데이트 -

그것은 내 방식을 사용할 수 없습니다 안드로이드에 새로운 경우 FireStore 버전 (11.6.0)을 보인다. 그러나 직접 전송할 수 있습니다.

DocumentReference docRef = (DocumentReference) map.get("reference_field"); 
관련 문제