![](/img/trans.png)
[英]Firebase Query - Accessing nested object in Firebase Android
[英]Firebase - query on nested key?
我正在运行一个Android应用程序,该应用程序处理有关Events
和已受邀请的Users
一些数据。 我有一个页面需要显示用户被邀请参加的所有事件,但是我对Firebase还是比较陌生,我不确定查询语法如何适用于当前数据结构。
我的数据结构(带有虚拟键)的示例如下所示:
events
event1_key
eventName: "test event"
eventAdmin: "userAdmin"
eventInvites
user1_key
attending: true
responseTimestamp: 1525416294951
user2_key
//...
event2_key
//...
eventInvites
user2_key
//...
user3_key
//...
因此,使用此示例,如果我要查找已邀请user1_key
所有事件,则查询应仅返回event1_key
记录,因为该记录具有嵌套的eventInvite
的user1_key
。
如果我正在用Java for Android Studio运行该查询,那么有人知道它的外观吗?
为了实现您想要的目标,我建议在数据库结构中添加另一个如下所示的节点:
Firebase-root
|
--- userEvents
|
--- user1_key
|
--- event1_key: true
|
--- event2_key: true
这样,您将能够一次读取与特定用户相对应的所有事件,而无需下载enitire events
对象。 要获取这些ID,请使用以下代码:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userKeyRef = rootRef.child("userEvents").child(userKey);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String eventKey = ds.getKey();
Log.d("TAG", eventKey);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
userKeyRef.addListenerForSingleValueEvent(valueEventListener);
我认为在这种情况下,您需要在另一个节点中复制数据。 现在,您有一个保留所有events
节点(即events
节点)。 我建议您也为用户创建一个单独的表(即单独的节点)。
该节点结构可能如下所示。
users
user1_key
events1_key
events2_key
...
user2_key
events5_key
events2_key
....
....
这样,您将不需要任何嵌套的查找。 在事件节点下插入数据时,也只需在此节点中复制数据。
希望有帮助!
更新资料
如果您正在考虑复制表,那么检查用户是否正在参加活动将非常简单,如下所示。
userRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
boolean attending = false;
for (DataSnapshot eventSnapshot : dataSnapshot.getChildren()) {
if(eventSnapshot.getKey().equals(THE_DESIRED_EVENT)) {
attending = true;
break;
}
}
if(attending) doSomethingAsUserIsFoundToBeAttendingTheEvent();
else userIsNotAttending();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
该代码未经测试,我只有伪实现。 请根据您的需要进行修改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.