2017-10-15 84 views
5

我使用的公司的FireStore reference數據類型來存儲到用戶的參考如圖所示的截屏下面如何查詢Firebase Firestore引用數據類型?

用戶參考

enter image description here

用戶集合

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)) 
} 

堆棧跟蹤

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)在Android上不能用我的方式。但它可以直接投射

DocumentReference docRef = (DocumentReference) map.get("reference_field");