是否可以仅检索在建立值事件侦听器后添加/更改的子项?根据我的经验,它似乎可以取出每个孩子。
例如,在基于聊天的应用程序中,如果我想使用查询作为初始化步骤来获取最后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
答案 1 :(得分:0)
您的方法与Firebase的工作方式不同。当我们谈论Firebase时,一切都是listeners
。由于Firebase是Real Time Database
,因此您的数据库中的每项更改都会实时提供。只要您的听众未被删除,您就会注意到更改。只有在onDestroy
方法中删除侦听器时才能停止侦听:
databaseReference.removeEventListener(valueEventListener);
如果您想知道删除侦听器不需要新消息。您可以在名为read
的邮件中添加另一个字段,如果邮件未被阅读则设置为false
,如果已阅读则为true
。
希望它有所帮助。