在我创建聊天应用时,我正在使用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
答案 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()
我提供了一个文档链接。
答案 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);