从 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 中找到的子值的对象的主要内容,如果未能解决你的问题,请参考以下文章