繁体   English   中英

Firebase-查询嵌套键?

[英]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记录,因为该记录具有嵌套的eventInviteuser1_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM