我正在运行一款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中运行该查询,是否有人知道它应该是什么样的?
答案 0 :(得分:1)
为了实现您的目标,我建议在数据库结构中添加另一个节点,如下所示:
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);
答案 1 :(得分:1)
在这种情况下,我认为您需要在另一个节点中复制数据。现在,您有一个节点可以保留所有事件(即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) {
}
});
代码没有经过测试,我只是有伪实现。请根据您的需要进行修改。