我有一个这样组织的Firestore数据库:
我有三个片段显示:所有帖子,用户关注的个人帖子以及用户的所有帖子。我的问题是要获得用户关注的个人的职位,而其他两个则要工作。
我以前曾尝试从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 {
}
}
});
}
答案 0 :(得分:2)
您的代码中存在两个主要问题。第一个将在以下代码行中:
Query posts = db.collection("posts").whereEqualTo("userId", group);
group
对象不在其定义的范围内,因此这就是编译错误的原因。除此之外,您无法传递whereEqualTo()
方法作为列表的第二个参数。如果要为数组中的每个用户创建一个新查询,则应对其进行迭代,并将String作为第二个参数传递。
第二个问题是onComplete()
具有异步行为。即使您将列表创建为全局变量,也无法使用,因为该方法会立即返回,而您尝试在group
方法之外使用的onDataChange()
列表的值将尚未从回调中填充。
该问题的快速解决方案是将上述代码行移至onComplete()
方法内,并传递一个String和 not 列表,否则,建议您看最后一部分我的 post 中的答案,其中我解释了如何使用自定义回调来完成。您也可以查看此 video 以获得更好的理解。