从 Firebase 查询具有在 ArrayList 中找到的子值的对象

Posted

技术标签:

【中文标题】从 Firebase 查询具有在 ArrayList 中找到的子值的对象【英文标题】:Query objects from Firebase that have a child value found inside an ArrayList 【发布时间】:2019-09-29 00:59:06 【问题描述】:

我正在尝试将节点从 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】:

不幸的是,firebase 不允许多个equalTo()。我建议您以这种方式查看您的数据库:帖子 -> 日期 -> UserId -> 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"
        
     

【讨论】:

所以我无法循环遍历所有帖子并从帖子 ID 创建一个数组并通过它们以某种方式查询?我已经开发这个应用程序很长一段时间了,如果我对我的数据库结构进行更改,我将不得不修改很多代码。 我编辑了响应,添加了一个允许您维护数据库的规则。 抱歉,我对 firebase 实时数据库中的规则不太熟悉。我需要对这条规则进行什么样的查询? 您可以运行获取所有帖子的查询:规则直接从服务器更改可见范围,您无需通过应用程序进行任何过滤。我建议您研究它们here 并将它们添加到您的应用程序中。 很高兴为您提供帮助,如果您的问题得到解决,请accept the answer。 :)

以上是关于从 Firebase 查询具有在 ArrayList 中找到的子值的对象的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 时间戳值及查询 | JavaScript

在刷新之前,第一个 Firebase 查询项出现问题

具有限制/偏移的 Firebase 查询可能的解决方案

具有两次 orderByChild 条件的 Firebase 查询 [重复]

如何在firebase中进行类似sql的查询?

Flutter Bloc 与 firebase 查询有多种关系