addValueEventListener
会在数据库中发生更改时提供所有数据,因此我已经实现addChildEventListener
以获取数据库中有新内容时唯一的新项目。
目前,我遇到的问题是每当我打开应用时,addChildEventListener
都会在onChildAdded
方法中逐个获取所有项目。
有什么办法可以只在Firebase实时数据库中获取新项目吗?这是我的代码:
mDatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
News news = dataSnapshot.getValue(News.class);
Log.i("YES-onChildAdded", news.getId()+"/"+news.getHeadline());
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
News news = dataSnapshot.getValue(News.class);
Log.i("YES-onChildChanged", news.getId()+"/"+news.getHeadline());
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
News news = dataSnapshot.getValue(News.class);
Log.i("YES-onChildRemoved", news.getId()+"/"+news.getHeadline());
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
News news = dataSnapshot.getValue(News.class);
Log.i("YES-onChildMoved", news.getId()+"/"+news.getHeadline());
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.i("YES-Cancelled", databaseError.getMessage());
}
});
答案 0 :(得分:2)
当您在特定DatabaseReference
上附加侦听器时,这意味着侦听器将从引用所指向的位置检索所有数据。由于Firebase数据库不存储元数据,因此您需要自己为每条记录添加TIMESTAMP
。定义某个数据然后您可以创建一个查询来相应地过滤您的数据库。不幸的是,这是一种无法在Fireabse中更改的行为。
假设您有一个名为item
的节点,并且此节点中的每个项都已正确设置TIMESTAMP
,则使用TIMESTAMP
查询数据库的代码应如下所示:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("item").orderByChild("timestamp");
您还可以使用以下限制查询数据库:
Query query = rootRef.child("item")
.orderByChild("timestamp")
.startAt(startingTime)
.endAt(endingTime);