如何查询字符串列表而不是单个字符串并从Firestore获取结果列表

时间:2019-07-11 12:23:11

标签: java android firebase google-cloud-firestore firebaseui

我有一个本地存储在字符串列表中的用户喜欢的项目的ID列表。现在,当用户打开他的收藏夹区域时,应用程序需要从Cloud Firestore中获取本地收藏夹列表中的所有项目。现在,我看到的是只接受一个字段且只接受一个字符串的查询(在我的情况下,一次只接受一个喜爱项目的ID)。

是否可以通过一次操作将ID列表作为查询传递,并获得结果。我现在正在做的是将ID传递到RecylerView适配器,并在BindViewHolder中一个接一个地获取它。

@Override
public void onBindViewHolder(final ImageViewHolder holder, int position) {

    db.whereEqualTo("imageId",mUploads.get(position))
            .get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
        @Override
        public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
            List<Upload> uploadsList = queryDocumentSnapshots.toObjects(Upload.class);
            Upload uploadCurrent = uploadsList.get(0);

            holder.materialCardView.setCardBackgroundColor(Color.parseColor(uploadCurrent.getImageColor()));
            Glide.with(mContext)
                    .load(uploadCurrent.getImageUrl())
                    .transition(DrawableTransitionOptions.withCrossFade())
                    .centerCrop()
                    .into(holder.imageView);

        }
    });

}

1 个答案:

答案 0 :(得分:2)

  

是否可以通过一次操作将ID列表作为查询传递并获得结果。

不,没有。您无法将列表或字符串数​​组传递给查询,也无法一次性获得结果。在get()对象上调用Query时,返回的对象的类型为Task。遍历您的列表,创建那些Task对象,并将它们全部添加到List<Task<DocumentSnapshot>>中,然后将该列表传递给Tasks的whenAllSuccess()方法,如以下帖子中我的回答所述:

编辑:

您应该遍历字符串列表并创建Task对象。

Task<DocumentSnapshot> documentSnapshotTask = collRef.document(stringFromList).get();

因此,在每次迭代时,将Task对象添加到任务列表中:

List<Task<DocumentSnapshot>> tasks = new ArrayList<>();

最后,只需将tasks列表传递给whenAllSuccess()方法即可。