2017-10-15 56 views
5

Firebase Firestoreの参照データ型を照会する方法は?

ユーザー参照

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

STACKTRACE

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

私はこれが正しい方法であるとは確信していませんが、私にとってはこの方法が有効です。

- 更新 -

Android上で新しいfirestoreバージョン(11.6.0)は私の方法を使用することはできませんようです。しかし、それは直接キャストすることができます

DocumentReference docRef = (DocumentReference) map.get("reference_field"); 
関連する問題