【问题标题】:How to get only newly added data from the Firebase?如何仅从 Firebase 获取新添加的数据?
【发布时间】:2018-01-25 22:14:59
【问题描述】:

在创建聊天应用程序时,我正在使用 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() 来清除数据,以获取新添加的记录。每次从@​​987654323@ ,每当添加或删除新记录时,我都会获取整个数据列表。是他们的有什么方法可以只从 Firebase 获取新添加的数据而不是整个 List

【问题讨论】:

  • 您需要做的是添加查询以获取最新添加的值,而不是整个列表

标签: android firebase firebase-realtime-database


【解决方案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都会为你提供孩子的信息

【讨论】:

【解决方案2】:

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

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)原创

(我的)另一种解决方案

如果你可以控制你的数据库模式,你可以在你的对象中添加一个“日期时间”元素,并在将它添加到数据库之前以 Epoch 格式存储时间值,那么你可以简单地获取新的对象列表像这样添加限制的订单。

ds.orderBy("datetimeSent", Direction.DESCENDING).limit(10);

【讨论】:

  • 您的“另一种解决方案”真的帮助了我!谢谢!
【解决方案3】:

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

Listen for child events

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 2018-06-11
      相关资源
      最近更新 更多