2017-08-29 106 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,這是推薦的方法,但需要修改數據庫結構併爲以前的數據創建標誌。