【问题标题】:Firebase orderByChild not workingFirebase orderByChild 不起作用
【发布时间】:2018-02-07 06:00:19
【问题描述】:

我有这个数据库:

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() 方法?

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    Firebases SDK 不允许多级过滤。

    您必须遍历每个事件,检查该事件是否包含 userid2 如果为真则将其添加到列表中,否则忽略。它很容易实现,但如果数据量很大,将需要很长时间才能执行

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

    【讨论】:

      【解决方案2】:

      要获取用户号 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。这种技术被称为非规范化。我建议你看看这个tutorial

      希望对你有帮助。

      【讨论】:

      • 我已经考虑过这一点,但我一直在寻找一种更“优雅”的方式,而无需更改数据库的结构,但无论如何感谢。
      猜你喜欢
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      • 1970-01-01
      • 2019-04-13
      • 2017-08-22
      • 2020-12-26
      • 1970-01-01
      相关资源
      最近更新 更多