【问题标题】:Firebase Realtime Database read all existing dataFirebase 实时数据库读取所有现有数据
【发布时间】:2018-05-01 10:10:36
【问题描述】:

如果添加或删除新项目等,Firebase 实时数据库似乎会通知我。这很好,但是如何获取我之前收到通知的所有现有项目?

例如,假设我的应用正在列出数据库中的项目。我第一次启动了我的应用程序。然后创建了“item 1”和“item 2”。 Firebase 通知我“项目 1”和“项目 2”,因此我将它们添加到我的应用列表中。

现在,我的应用程序已关闭并重新启动。如果创建了新项目“项目 3”,我会收到通知,但如何再次检索“项目 1”和“项目 2”?简而言之,我想再次显示所有项目。

我已经搜索了示例,但我能找到的所有示例都是获取事件,而不是“阅读所有”。

PS:我认为你们两个花时间解释。我误解了 Firebase 实时数据库的工作原理;我以为我只会在会话中收到一次新项目的通知。似乎addChildEventListener 只能通知我有新项目,我可以通过addValueEventListener 及其dataSnapshot 访问整个项目。

【问题讨论】:

  • 我仍然认为你把他们弄糊涂了。 addValueEventListener 会在每次数据更改时通知您,而 addListenerForSingleValueEvent 只会通知您一次,但是您在其中获得的 DataSnapshot 取决于您附加到的查询。
  • 例如,如果你将 FirebaseDatabase.getInstance().getReference(key).orderByKey().limitToLast(1) 添加到它们,addValueEventListener 会传递给你一个按键排序的最后一个项目的快照,每次将新元素添加到节点时,addListenerForSingleValueEvent 都会通知您相同但仅一次。这并不一定意味着您获得的 dataSnapshot 是最后添加的项目,而是您在查询中提到的按键排序的最后一个项目。

标签: android firebase firebase-realtime-database


【解决方案1】:

要同时获取节点中存在的所有项目,即使是在您重新启动应用之前或之后添加的,您也需要 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

因此,使用此代码,您可以获得所有用户,即使他们是在您重新启动应用程序之前添加的。您可以实时获取数据。

【讨论】:

    【解决方案2】:

    您获得的结果将取决于您的查询。如果您编写一个查询来检索所有项目,您将获得一个节点的所有元素,如下例的第一个块:

    //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) {
    
                }
            });
    

    【讨论】:

      猜你喜欢
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 2023-02-23
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      相关资源
      最近更新 更多