Firebase实时数据库似乎通知我是否添加或删除了新项目等。这很好,但如何获取我之前通知过的所有现有项目?
例如,假设我的应用程序列出了数据库中的项目。我是第一次启动我的应用程序。然后"项目1"和"项目2"被创造。 Firebase通知我"项目1"和"项目2",所以我将它们添加到我的应用程序列表中。
现在,我的应用已关闭并重新启动。如果是新项目"项目3"创建后,我会收到通知,但我该如何检索"项目1"和"项目2"再次?简而言之,我想再次显示所有项目。
我搜索了一些例子,但我找到的所有例子都是得到事件,而不是"阅读全部"。
PS:我认为你们两个花时间解释。我误解了Firebase实时数据库是如何工作的;我以为我会在会话期间只收到一次新项目的通知。我似乎只能通过addChildEventListener
收到有关新项目的通知,我可以使用addValueEventListener
及其dataSnapshot访问整个项目。
答案 0 :(得分:2)
要获取节点中存在的所有项目,即使在重新启动应用程序之前添加了项目,也需要 to attach a listener on that node
。 Firebase中的所有内容都与听众有关。这意味着您正在侦听在该特定位置的数据库中所做的每个更改。因此,您可以随时从数据库中获取dataSnapshot
个特定节点。所以假设我们有一个如下所示的数据库:
Firebase-root
|
--- users
|
--- userId1
| |
| --- //details
|
--- userId2
|
--- //details
如果我们在users
节点上附加了一个监听器,我们可以创建一个List
,它可以包含所有这样的用户:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<String> list = new ArrayList<>();
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String userId = ds.getKey();
list.add(userId);
Log.d("TAG", userId);
}
Log.d("TAG", list);
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
usersRef.addListenerForSingleValueEvent(eventListener);
您的输出将是:
userId1
userId2
因此,使用此代码,您可以获得所有用户,即使在您重新使用之后的应用程序之前添加了这些用户。您可以实时获取数据。
答案 1 :(得分:1)
您获得的结果取决于您的查询。如果您编写查询以检索所有项目,您将获得节点的所有元素,如以下示例的第一个块中所示:
//Prefetch all the existing items for the node using a SingleValueEventListener
FirebaseDatabase.getInstance().getReference(key).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//Fetches all the existing items
Iterable<DataSnapshot> snapshotIterable = dataSnapshot.getChildren();
for (DataSnapshot aSnapshotIterable : snapshotIterable) {
aSnapshotIterable.getValue(Item.class);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
//Once you fetch all the existing items,add a listener on the last added item for realtime updates
FirebaseDatabase.getInstance().getReference(key).orderByKey().limitToLast(1).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Iterable<DataSnapshot> snapshotIterable = dataSnapshot.getChildren();
Iterator<DataSnapshot> snapshotIterator = snapshotIterable.iterator();
//Fetches the last added item
if (snapshotIterator.hasNext()) {
Item value = snapshotIterator.next().getValue(Item.class);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});