如何仅从Firebase获取新添加的数据?

问题描述 投票:0回答:4

在我创建聊天应用程序时,我正在使用Firebase。它工作得很完美,每次我从Firebase获取整个数据列表时,只有一个问题,当新项目被添加或删除时。

我想要的是,只有新添加的记录应该来自Firebase,而不是整个数据列表。

请检查我的以下代码

 ArrayList<ChatMessage> MY_ARRAYLIST= new ArrayList<>();

        MsgViewHolder viewModel = ViewModelProviders.of(this).get(MsgViewHolder.class);

        LiveData<DataSnapshot> liveData = viewModel.getDataSnapshotLiveData();

        liveData.observe(this, dataSnapshot -> {
            if (dataSnapshot != null) {
                MY_ARRAYLIST.clear();  //  I NEED TO CLEAR THE ARRAY-LIST TO GET THE REFRESHED DATA..I DO NOT WANT TO LOAD WHOLE LIST ON EACH TIME
                if (dataSnapshot.exists())
                    for (DataSnapshot ds : dataSnapshot.getChildren()) {
                        ChatMessage bean = ds.getValue(ChatMessage.class);

                        assert bean != null;
                        MY_ARRAYLIST.add(bean);

                    }
            }
        });

如上面的代码我使用MY_ARRAYLIST.clear()清除数据,以获取新添加的记录。每次从DataSnapshot,我得到整个数据列表,每当新记录添加或删除。是他们的任何方法只获得新添加数据不是来自Firebase的整个List

android firebase firebase-realtime-database
4个回答
1
投票

您可以使用addChildEventListener() DatabaseReference,当任何孩子被添加/删除/更新/删除或移动时,它将通过不同的回调方法通知您

databaseRef.addChildEventListener(new ChildEventListener() {

        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
            // If any child is added to the database reference
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            // If any child is updated/changed to the database reference
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
          // If any child is removed to the database reference
        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
             // If any child is moved to the database reference
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            Log.e("FirebaseListAdapter", "Listen was cancelled, no more updates will occur");
        }
    });

每个回调中的DataSnapshot将为您提供子项的信息


0
投票

我想你可以使用这个监听器onChildAdded()我提供了文档的链接。

Listen for child events


0
投票

您可以尝试使用Query查询数据库,将子项添加为date and time并在每次结果更新查询后根据该数据查询上次同步日期和时间


0
投票

这是设计的,在实时系统中没有“最新”数据的概念,因为它总是在变化。但是,如果您只想在页面加载后显示添加到列表中的项目,则可以执行以下操作:

var newItems = false;
var eventsList = new Firebase('https://*****-messages.firebaseio.com/');

eventsList.on('child_added', function(message) {
  if (!newItems) return;
  var message = message.val();
  $.notification(message.message);
});
eventsList.once('value', function(messages) {
  newItems = true;
});

以上答案原文(anant)

(我)另一个解决方案

如果您可以控制数据库模式,则可以在对象中添加“datetime”元素,并在将其以Epoch格式添加到数据库之前存储时间值,然后您可以使用新添加的顺序获取对象列表这样的限制。

ds.orderBy("datetimeSent", Direction.DESCENDING).limit(10);
© www.soinside.com 2019 - 2024. All rights reserved.