2017-06-05 54 views
0

我想了解如何在Android Firebase中使用有限子女檢索數據。這裏是我的數據結構:如何限制在Firebase中檢索到的孩子Android

"chatrooms": 
    "chatroom_id_1" : 
     "message": 
      "message_id_1":1 
      "message_id_2":1 
      "message_id_3":1 
      "message_id_4":1 
      "message_id_5":1 
      "message_id_6":1 
      "message_id_7":1 
      "message_id_8":1 
      "message_id_9":1 
      "message_id_10":1 
      "message_id_11":1 
    "chatroom_id_2" : 
      "message": 
       "message_id_12":1 
       "message_id_13":1 
       "message_id_14":1 
       "message_id_15":1 
       "message_id_16":1 
       "message_id_17":1 
       "message_id_18":1 
       "message_id_19":1 
       "message_id_20":1 
       "message_id_21":1 
       "message_id_22":1 

從上面的結構中,如何檢索一個只有數據限制爲5條消息的快照?

我想有dataSnapshot是這樣的:

DataSnapshot { 
    key = chatroom_id_1, 
    value = { 
     messages={ 
      message_id_1=1, 
      message_id_2=1, 
      message_id_3=1, 
      message_id_4=1, 
      message_id_5=1 
     } 
    } 
} 
DataSnapshot { 
     key = chatroom_id_2, 
     value = { 
      messages={ 
       message_id_12=1, 
       message_id_13=1, 
       message_id_14=1, 
       message_id_15=1, 
       message_id_16=1 
      } 
     } 
    } 

是有可能這樣做?因爲我發現的大多數教程都只能限制檢索的孩子,而不能限制內心的孩子。謝謝

編輯:我的message_id是隨機生成的,所以要獲取message_id我必須使用帶有迭代器的DataSnapshot。這裏是我的檢索數據的代碼

public void retrieveChatRoom(final Callback callback){ 
     DatabaseReference ref = reference.child("chatrooms"); 
     ref.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       callback.onDataChanged(); 
       Iterator i = dataSnapshot.getChildren().iterator(); 
       while (i.hasNext()) { 
        DataSnapshot dataSnapshot1 = (DataSnapshot) i.next(); 
        callback.dataReceived(dataSnapshot1); 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
    } 

的東西是DataSnapshot返回所有chat_message的我的聊天室裏面,我可以把它限制爲僅返回5級的消息?

回答

0

要檢索子節點的子集,請使用Firebase queries。如果您要同步的子節點達到一定的鍵,你會使用:

Query query = ref.child("chatroom_id_1/message") 
    .orderByKey() 
    .endAt("message_id_5"); 
query.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
    for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { 
     System.out.println(childSnapshot.getKey()); 
    } 
    } 
    ... 

如果你只是希望從一個位置獲得5個消息:

Query query = ref.child("chatroom_id_1/message") 
    .orderByKey() 
    .limitToFist(5); 
query.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
    for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) { 
     System.out.println(childSnapshot.getKey()); 
    } 
    } 
    ... 

更新

Firebase數據庫查詢可以根據執行它們的位置的每個子節點的固定屬性(或路徑)來限制結果。無法一次檢索每個聊天室的最後5條消息。您可以檢索特定聊天室的最後5條消息。或最後5個聊天室。

+0

從你的回答就意味着我們必須知道chatroom_id鍵和MESSAGE_ID關鍵?在我的情況下,密鑰是隨機生成的,所以我不知道聊天室和消息的關鍵。如果我們不知道chatroom_id和message_id,有沒有辦法做到這一點? – VincentTheonardo

+0

如果你不知道聊天室ID,你怎麼知道從哪個房間檢索消息? –

+0

我正在使用迭代器從datasnapshot中檢索我的chatroom_id。問題是datasnapshot返回裏面的所有子項。我想要做的就是限制孩子回到只有5個孩子。謝謝 – VincentTheonardo

0

儘管可以做,但您當前的數據庫結構對於這類查詢並不理想。

您需要「非規範化」您的數據。 而不是存儲聊天室內的所有消息將它們分開。

訣竅是將所有消息分別存儲爲「chatroom_id」下的列表。這樣,您可以輕鬆獲取給定聊天室的所有消息,並使用Firebase限制API。

喜歡的東西

/chatrooms 
    - chatroom_id1 
     { 
      name, 
      last_message, 
      timestamp 
     } 

/messages 
    - chatroom_id //<-- Notice this 
     { 
      sender, 
      content, 
      timestamp 
     }   //<-- Add new child messages here 

那麼你可以得到的信息對於一個給定chatroom_id像

//Get chatroom list and details 
ref.child("chatrooms") 
ref.child("chatrooms").child("some_chatroom_id") 

//Get limited messages 
ref.child("messages").child("some_chatroom_id").limitToFirst(10) 

這將減少帶寬使用的額外的好處,當你只是需要從那以後聊天室列表整個消息列表將不會被提取。

Firebase Reference

相關問題