只在ValueEventListener启动后检索更改的数据

时间:2017-05-04 06:38:55

标签: android firebase firebase-realtime-database

是否可以仅检索在建立值事件侦听器后添加/更改的子项?根据我的经验,它似乎可以取出每个孩子。

例如,在基于聊天的应用程序中,如果我想使用查询作为初始化步骤来获取最后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仅在创建片段时调用)但这似乎没有太大变化。

这只是为了避免无缘无故地获取整个数据堆。

2 个答案:

答案 0 :(得分:1)

您应该使用child event listener

答案 1 :(得分:0)

您的方法与Firebase的工作方式不同。当我们谈论Firebase时,一切都是listeners。由于Firebase是Real Time Database,因此您的数据库中的每项更改都会实时提供。只要您的听众未被删除,您就会注意到更改。只有在onDestroy方法中删除侦听器时才能停止侦听:

databaseReference.removeEventListener(valueEventListener);

如果您想知道删除侦听器不需要新消息。您可以在名为read的邮件中添加另一个字段,如果邮件未被阅读则设置为false,如果已阅读则为true

希望它有所帮助。