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

时间:2018-01-25 12:34:31

标签: android firebase firebase-realtime-database

在我创建聊天应用时,我正在使用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

4 个答案:

答案 0 :(得分: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将为您提供孩子的信息

答案 1 :(得分:0)

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

Listen for child events

答案 2 :(得分:0)

您可以尝试使用Query查询数据库,将子项添加为// defined by linker script, pointing to end of static allocation extern unsigned _heap_start; void fill_heap(unsigned fill=0x55555555) { unsigned *dst = &_heap_start; register unsigned *msp_reg; __asm__("mrs %0, msp\n" : "=r" (msp_reg) ); while (dst < msp_reg) { *dst++ = fill; } } ,并根据每个结果更新查询后的数据进行查询,以查询上次同步日期和时间

答案 3 :(得分: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);