提问者:小点点

查询多个字段-数组Firestore


我的android应用程序中有一些复选框。 我想在用户选中的复选框的基础上做一个firestore查询。 我已经设法在一个数组中添加了所有选中字段的名称。 因此,如果我的应用程序有10个复选框的名称-项目1,项目2.。。。。项目10,如果用户选中框3,4和10。 我得到一个数组:

testArray=[item 3,item 4,item 10]

现在我要根据布尔值-true查询这个数组。 我的数据库也包含字段,即项目1,项目2.。。。。项目10,它们具有不同的布尔值。

我试了一下:

FirebaseFirestore.getInstance()
             .collection("Users")
             .whereEqualTo(testArray.toString(),true)
             .get()
             .addOnSuccessListener(
   new OnSuccessListener<QuerySnapshot>() {
   @Override
   public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
     List<DocumentSnapshot> 
     snapshotList=queryDocumentSnapshots.getDocuments();
     for(DocumentSnapshot snapshot:snapshotList){
                  Log.d("TAG", "onSuccess: "+snapshot.getData());
                }
           }
     }).addOnFailureListener(
   new OnFailureListener() {
   @Override
   public void onFailure(@NonNull Exception e) {

   }});

我得到了一个错误:

 java.lang.IllegalArgumentException: Use FieldPath.of() for field names containing '~*/[]'.
        at com.google.firebase.firestore.util.Preconditions.checkArgument(com.google.firebase:firebase-firestore@@21.4.3:117)
        at com.google.firebase.firestore.FieldPath.fromDotSeparatedPath(com.google.firebase:firebase-firestore@@21.4.3:83)
        at com.google.firebase.firestore.Query.whereEqualTo(com.google.firebase:firebase-firestore@@21.4.3:94)
        at com.example.XX.todayQuestionFragment$1.onClick(todayQuestionFragment.java:134)
        at android.view.View.performClick(View.java:7201)
        at android.view.View.performClickInternal(View.java:7170)
        at android.view.View.access$3500(View.java:806)
        at android.view.View$PerformClick.run(View.java:27582)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7710)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

现在我尝试按照IDE的建议使用fieldPath.of()。 即我被替换

testArray.toString()

与:

FieldPath.of(testArray)

使用这个,我没有得到任何错误,但我也没有得到我的数据。 debug部分中的日志猫为空。

如何进行此查询? 请记住,我不知道数组的内容或大小。 这取决于用户的输入。 问题不是从复选框中获取数组,而是在字段是数组成员的地方进行查询。 任何见解都会很有帮助


共1个答案

匿名用户

如果您有一个布尔字段,并且要测试该字段是否等于数组中的一个值,则需要查找whiche函数:

FirebaseFirestore.getInstance()
         .collection("Users")
         .whereIn("nameOfField", testArray);

如果您有一个带有布尔值的数组字段,并且您想要测试这些布尔值中的任何一个是否与本地数组中的任何值匹配,那么您正在查找wherearraycontainsany:

FirebaseFirestore.getInstance()
         .collection("Users")
         .whereArrayContainsAny("theArrayField", testArray);

如果您的文档中有多个要测试的字段,那么它实质上就变成了,其中field1=true或field2=true

这是Firestore不支持的一种查询类型。