是否可以在Android中合并未知数量的Firestore查询?

时间:2019-07-03 20:46:59

标签: java android firebase google-cloud-firestore

This的答案涉及如何将两个查询合并在一起,我认为可以对任意数量的已知查询执行此操作。但是,我有一个值数组,用于过滤包含具有这些值的字段的文档(对于所有值,该字段都是同一字段)。上面链接的方法似乎不足以实现此目的。

我尝试使用new运算符创建查询数组,但是由于Query是私有的,因此无法正常工作。

Query query = db.collection("posts")
                .whereEqualTo("userId", followingList)//followingList is a list of Strings that I want to query
                .orderBy("imageUrl_1", Query.Direction.ASCENDING);

这不起作用,因为followingList不是String

我如何创建无法使用的查询数组:

ArrayList<Query> list = new ArrayList<Query>();
        for(String s : followingList){
            list.add(new Query());//does not compile
        }

enter image description here 我的Firestore的这张图片显示了followingList的创建方式。当用户单击另一个用户的帖子后,它会更新。我想要做的是创建一个查询所有帖子的信息(包含在一个单独的集合中),这些帖子包含followingList

中包含的用户

1 个答案:

答案 0 :(得分:1)

我已经在我当前的项目中对此进行了测试,它工作正常(仅对两个具有followingList.size为2个元素的文档进行了测试)

public void testMy() {
        db = FirebaseFirestore.getInstance();
        List<String> followingList = new ArrayList<>();
        followingList.add("tag1"); followingList.add("tag2"); followingList.add("tag3"); // ...
        List<Task> taskList = new ArrayList<>();

        for (String s : followingList) {
            Query query = db.collection("invites")
                    .whereEqualTo("uid", s)
                    .orderBy("imageUrl_1", Query.Direction.ASCENDING);; //followingList is a list of Strings that I want to query
            Task<QuerySnapshot> task = query.get();
            taskList.add(task);
        }

        Tasks.whenAllSuccess(taskList.toArray(new Task[taskList.size()])).addOnSuccessListener(new OnSuccessListener<List<Object>>() {
            @Override
            public void onSuccess(List<Object> objects) {
                @SuppressWarnings("unchecked")
                List<QuerySnapshot> querySnapshots = (List<QuerySnapshot>)(List<?>) objects;
                for (QuerySnapshot qs : querySnapshots) {
                    for (QueryDocumentSnapshot qds : qs) {
                        Log.d(TAG, qds.getData().toString());
                    }
                }
            }
        });
    }