2017-05-04 50 views
0

是否可以僅檢索在值事件偵聽器建立之後添加/更改的子項?從我的經驗看來,它似乎能夠抓住每一個孩子。僅在ValueEventListener啓動後檢索已更改的數據

例如,在一個基於聊天應用程序,如果我想使用查詢的最後10條信息作爲初始化步驟

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
Query queryRef = database.getReference(MESSAGES) 
     .limitToLast(messagesToLoad); 

queryRef.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 

     // Load then new chat message 
     ChatMessage message = dataSnapshot.getValue(ChatMessage.class); 
     if (message != null) 
     { 
      mMessageList.add(0, message); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 

之後取,我要附加一個ValueEvenListener偵聽到的變化。

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
DatabaseReference ref = database.getReference(MESSAGES); 

ref.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     ChatMessage message = dataSnapshot.getValue(ChatMessage.class); 
     if (message != null) { 
      mMessageList.add(0, message); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 

編輯:我已經轉換爲childEventListener當增加新的消息,但我顯然無法做到這一點與單ValueEventListener查詢。我也調整了它,所以他們現在使用相同的數據庫引用(childEventListener僅在創建片段時調用),但這似乎沒有太大的改變。

這只是爲了避免無緣無故地獲取整個數據堆。

+0

你最終解決了這個問題嗎?我有一個類似的問題,因爲你不知道該怎麼辦 –

回答

1

您應該使用child event listener

+0

對不起,以前的評論,但經過正確測試,這似乎不工作。它仍然加載所有的孩子。 – ReallyGoodPie

0

你的做法是不是怎麼火力地堡的作品不同。當我們談論Firebase時,一切都是關於listeners。由於Firebase是Real Time Database,因此您的數據庫中所做的每一項更改都是實時提供的。只要你的聽衆沒有被刪除,你就會被注意到更改。您可以停止只聽如果刪除了聽衆在onDestroy方法是這樣的:如果你想知道哪些是新的消息沒有必要刪除監聽

databaseReference.removeEventListener(valueEventListener); 

。您可以在您的消息中添加另一個字段,例如read,如果消息未被讀取則將其設置爲false,如果消息被讀取則將其設置爲true

希望它有幫助。

相關問題