如何查询Firebase Firestore参考数据类型?

时间:2017-10-15 03:45:03

标签: android firebase kotlin google-cloud-firestore

我正在使用Firestore reference数据类型来存储对用户的引用,如下面的屏幕截图所示

  

用户参考

enter image description here

  

用户集合

enter image description here

当我尝试查询此数据时,我得到一个printf("hp_addr_list[%d] = %s\n", j, inet_ntoa(*((struct in_addr *)hp->h_addr_list[j]))); (我试图仅仅为了它而投射到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) 似乎是一个不应该使用的内部类)

截至目前,我没有在docs中找到任何参考类型的示例。 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

Firebox在从集合中获取引用时返回DocumentReference。如果将演员表更改为DocumentReference不起作用,请跟踪此issue

答案 1 :(得分:2)

我们需要看一些代码来给你答案。但同时这里是我的查询片段,它假设你正在寻找独特的东西,如果不是你可以循环结果。

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");

                                }

                            }
                        }
                    });

答案 2 :(得分:1)

我遇到了同样的问题。但是我可以使用以下方法解决这个问题:

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

我不确定这是否正确,但这种方式对我有用。

- 更新 -

似乎Android上的新firestore版本(11.6.0)无法使用我的方式。但是它可以直接投射

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