在我创建聊天应用程序时,我正在使用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
?
您可以使用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将为您提供子项的信息
我想你可以使用这个监听器onChildAdded()
我提供了文档的链接。
您可以尝试使用Query查询数据库,将子项添加为date and time
并在每次结果更新查询后根据该数据查询上次同步日期和时间
这是设计的,在实时系统中没有“最新”数据的概念,因为它总是在变化。但是,如果您只想在页面加载后显示添加到列表中的项目,则可以执行以下操作:
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);