2017-08-29 116 views
0

我有这个数据库:火力地堡orderByChild不工作

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

我想获得的所有事件id其中用户号2上存在。所以,就我所关心的,我可以使用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的用户名,它检索我所有的事件。没关系,因为用户号码2参与了这两个事件。但是,如果我改变了userid1,它仍然检索我所有的事件,而它应该只获得第一个。我是否正确理解orderByChild()方法?

回答

1

为了让所有的事件ID,其中用户号2存在,我建议你创建一个名为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

希望它有帮助。

+0

我已经想过这个了,但是我正在寻找一种更加“优雅”的方式,而不必更改数据库的结构,不过谢谢。 – xBlackout

1

Firebases SDK不允许多级别过滤。

要么你必须遍历每个事件,检查该事件是否包含userid2将其添加到列表如果真正的其他明智忽略。这很容易实现,但将永远执行,如果数据是巨大的

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