我正在尝试从Firebase实时数据库查询到我的Firebase回收器适配器的节点,其中在字符串ArrayList中找到“ userId”子值。
因此,我有一个名为“ Follows”的节点,其中存储了应用内每个用户的关注。 It looks like this。然后,我有一个名为“帖子”的节点,其中存储了任何用户的每个帖子。每个个人帖子都有多个包含有关该帖子的信息的子元素,其中一个名为“ userId”的子元素。 Looking like this。
我已经像这样检索了每个以下用户ID:
final ArrayList<String> usersFollows = new ArrayList<>();
DatabaseReference usersFollowsRef = FirebaseDatabase.getInstance().getReference().
child("Follows").child(currentUserId);
usersFollowsRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
if(dataSnapshot.exists())
{
for(DataSnapshot snapshot : dataSnapshot.getChildren())
{
String followsKey = snapshot.getKey();
usersFollows.add(followsKey);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
现在,我将必须进行查询,以检索在此“ usersFollows” ArrayList中找到的每个具有“ userId”值的帖子,但我真的不知道如何实现我的目标。例如,我无法编写Query query = postsReference.orderByChild("userId").equalTo(usersFollows);
,因为您无法在equalTo()语句中传递数组。
我是在正确的道路上吗,还是有更方便的方法呢?
答案 0 :(得分:1)
不幸的是,firebase不允许多个equalTo()
。我建议您以这种方式查看数据库:帖子->日期->用户ID-> PostId,并添加一个.read规则,以检查“关注”列表中的UserId是否为真:
Posts: {
"$date" :{
"$userId": {
".read": "root.child(follows).child(auth.uid).child($userId).val() === true"
}
}
}
通过这种方式,您可以按日期获取帖子并自动缩小可见性范围。
编辑:
您可以添加以下规则来维护您的实际架构:
Posts: {
"$post":{
".read": "root.child(follows).child(auth.uid).child(data.child(userId)).val() === true"
}
}