从Firebase查询在ArrayList

时间:2019-05-11 09:42:41

标签: android firebase firebase-realtime-database

我正在尝试从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()语句中传递数组。

我是在正确的道路上吗,还是有更方便的方法呢?

1 个答案:

答案 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"
        }
     }