Firebase orderByChild无法正常工作

时间:2017-08-29 17:19:24

标签: android firebase firebase-realtime-database

我有这个数据库:

event_users
    - eventid1:
        - userid1: "username1"
        - userid2: "username2"
    - eventid2:
        - userid2: "username2"
        - userid4: "username4"

我想获取用户号码2所在的所有事件ID。所以,正如我所关注的,我可以使用orderByChild(userid2)来实现这一点。这是我的代码:

rootRef.child(EVENT_USERS_KEY).orderByChild(uid).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.d(TAG, dataSnapshot.getValue().toString());
            final long eventCount = dataSnapshot.getChildrenCount();
            Log.d(TAG, String.valueOf(eventCount));

            ...
}

说'uid'是用户2的用户ID,它会检索我所有事件。没关系,因为用户2是两个事件的参与者。但是,如果我为userid1更改了它,它仍会检索我所有事件,而它应该只获取第一个事件。我是否正确理解了orderByChild()方法?

2 个答案:

答案 0 :(得分:1)

要获取存在用户编号2的所有事件ID,我建议您创建另一个名为users的节点,如下所示:

event_users
    - eventid1:
        - userid1: "username1"
        - userid2: "username2"
    - eventid2:
        - userid2: "username2"
        - userid4: "username4"
users
   - userid1
       - events
           - eventid1: true
   - userid2
       - events
           - eventid1: true
           - eventid2: true

因此,要实现这一点,您只需要在\users\userId\eventId上设置一个侦听器,并从特定事件中获取所有事件ID。这个tehnique被命名为非规范化。我建议你看一下这个tutorial

希望它有所帮助。

答案 1 :(得分:1)

Firebase SDK不允许多级过滤。

要么必须遍历每个事件,请检查该事件是否包含userid2,如果为true,则将其添加到列表中。它很容易实现,但如果数据很大,将会永远执行

否则,请检查Alex Mamo's Answer,这是推荐的方法,但需要修改数据库结构并为以前的数据创建标记。