如何在 Firebase 实时数据库中找到给定 JSON 树中描述的指定数据?
Posted
技术标签:
【中文标题】如何在 Firebase 实时数据库中找到给定 JSON 树中描述的指定数据?【英文标题】:How to find the specified data as described in given JSON tree in Firebase Realtime Database? 【发布时间】:2019-11-21 13:07:52 【问题描述】:在以下好友请求的 JSON 结构中,“LONiSEYOArTUAYF2CJ2zf6EzpqC”是当前用户 ID。它嵌套了用户的用户 ID,他从这些用户中接收到请求或向其发送了请求。现在我想获取所有嵌套用户的用户 ID,这些用户在 android 中向当前用户发送了请求,ID 为“LONiSEYOArTUAYF2CJ2zf6EzpqC”。
我在 Android 中尝试过以下代码。
Database Reference mRequestDatabase = FirebaseDatabase.getInstance().getReference().child("Requests").child(currentUserId);
Query query =
mRequestDatabase.orderByChild("request_type").equalTo("received");
但是这个查询不起作用,因为数据库引用是currentUserId
。如何遍历当前用户 ID 下的所有用户并检查哪些有 request_type = "received"?
"Requests" :
"LONiSEYOArTUAYF2CJ2zf6EzpqC":
"anicGIuuLSQndxMKI8ieZDhMHOP":
"request_type" : "received"
,
"TIh83WLasxYxLxJmUh619imfnrd" :
"request_type" : "received"
,
"LioCIXTY8_Cgii2TtHb" :
"NthWyK6XoLdAOZCdmkJXIGS3YuR2" :
"request_type" : "received"
,
"91cGZGssoTQOoepy" :
"NthWyK6XoLdAOZCdmkJXIGS3YuR2" :
"request_type" : "send"
【问题讨论】:
为什么说你的查询不起作用?你添加了监听器吗? 【参考方案1】:您的查询似乎很好。如果要获取当前用户request_type
等于"received"
的请求的key,可以通过如下方式获取key:
DatabaseReference requestDatabase = FirebaseDatabase.getInstance().getReference()
.child("Requests")
.child(currentUserId);
final List<String> senderUserIds = new ArrayList();
requestDatabase.orderByChild("request_type").equalTo("received")
.addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
for (DataSnapshot requestSnapshot : dataSnapshot.getChildren())
senderUserIds.add(requestSnapshot.getKey());
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
);
推荐
如果你能够改变数据库的结构,你可以像这样展平它:
"Requests":
"request_id_1":
"sender_user_id": "user_1",
"recipient_user_id": "user_2"
那么,你可以这样查询:
DatabaseReference requestsRef = FirebaseDatabase.getInstance().getReference().child("Requests");
final List<String> senderUserIds = new ArrayList();
requestsDatabase.orderByChild("recipient_user_id").equalTo(currentUserId).addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
for (DataSnapshot itemSnapshot : dataSnapshot.getChildren())
Request request = itemSnapshot.getValue(Request.class);
senderUserIds.add(request.getSenderUserId());
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
);
这是Request
类:
public class Request
private String senderUserId;
private String recipientUserId;
Request()
// Default constructor required for calls to DataSnapshot.getValue(Request.class)
Request(String senderUserId, String recipientUserId)
this.senderUserId = senderUserId;
this.recipientUserId = recipientUserId;
public String getSenderUserId()
return senderUserId;
public void setSenderUserId(String senderUserId)
this.senderUserId = senderUserId;
public String getRecipientUserId()
return recipientUserId;
public void setRecipientUserId(String recipientUserId)
this.recipientUserId = recipientUserId;
【讨论】:
非常感谢。这非常有用。以上是关于如何在 Firebase 实时数据库中找到给定 JSON 树中描述的指定数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何在flutter中从firebase实时数据库中获取数据?
如何从 Firebase 实时数据库中获取数据到 Flutter 中的列表中?
Firebase : Firestore : 在实时数据库中找到的 ChildEventListener 的等价物是啥