Firebase - 查询嵌套密钥?

时间:2018-05-04 15:16:12

标签: java android firebase-realtime-database

我正在运行一款Android应用,可以处理已被邀请加入EventsUsers的某些数据。我有一个页面需要显示用户被邀请参加的所有事件,但我对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中运行该查询,是否有人知道它应该是什么样的?

2 个答案:

答案 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) {

    }
});

代码没有经过测试,我只是有伪实现。请根据您的需要进行修改。