gpt4 book ai didi

java - 如何根据存储在另一个集合中的数组过滤 Firestore 中的文档?

转载 作者:行者123 更新时间:2023-11-29 18:29:53 25 4
gpt4 key购买 nike

我有一个像这样组织的 Firestore 数据库:

FirestoreDB FireStore DB

我有三个 fragment 显示:所有帖子、用户关注的个人帖子和用户的所有帖子。我的问题是让用户正在关注的个人的帖子起作用,其他两个起作用。

我以前曾尝试从 Firestore 获取数组并使用该数组查询关注用户的帖子,但我无法访问生成它的方法之外的数组,如下所述:https://firebase.google.com/docs/firestore/query-data/get-data#get_a_document

像这样:

DocumentReference docRef = db.collection("following").document(currentUser.getUid());
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
List<String> group = (List<String>) document.get("following");
} else {
}
} else {
}
}
});

Query posts = db.collection("posts").whereEqualTo("userId", group);//Does not compile since cannot resolve group.

然后我使用 DocumentSnapshot 创建了一个数组,但是由于我的查询超出了该方法的范围,所以我无法使用创建的数组。

我目前无法使用的是以下内容:

Query posts = db.collection("posts").whereEqualTo("userId", FirebaseFirestore.getInstance()
.collection("following")
.document(currentUser.getUid()));

感谢您提供的任何帮助。

最后一期

private void readData(MyCallback callback){
DocumentReference docRef = db.collection("following").document(currentUser.getUid());
docRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (DocumentSnapshot document : Objects.requireNonNull(task.getResult())){
String group = document.getString("following");
followingList.add(group);
}
callback.onCallback(followingList);//says must be declared final
} else {
}
}
});
}

最佳答案

您的代码中存在两个主要问题。第一个将在以下代码行:

Query posts = db.collection("posts").whereEqualTo("userId", group);

group 对象不在定义它的范围内,所以这就是编译错误的原因。除此之外,您无法将列表作为第二个参数传递给 whereEqualTo() 方法。如果您想为数组中的每个用户创建一个新查询,您应该对其进行迭代并将字符串作为第二个参数传递。

第二个问题是 onComplete() 具有异步行为。即使您已将列表创建为全局变量,它也不会起作用,因为该方法会立即返回并且您的 group 列表的值是您尝试在 onDataChange( ) 方法,尚未从回调中填充。

一个快速解决这个问题的方法是将上面的代码行移到 onComplete() 方法中并传递一个字符串而不是 不是 列表,否则我建议你从这个 post 看到我的答案的最后一部分 我在其中解释了如何使用自定义回调来完成。你也可以看看这个 video 以便更好地理解。

关于java - 如何根据存储在另一个集合中的数组过滤 Firestore 中的文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56839226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com