当前位置: 首页 > 知识库问答 >
问题:

Firebase实时数据库读取所有现有数据

戎洛华
2023-03-14

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

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

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

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

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

共有2个答案

勾安翔
2023-03-14

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

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

            }
        });
司寇凯
2023-03-14

要获取某一时刻节点中存在的所有项,即使是在重启应用程序之前或之后添加的,也需要< code >在该节点上附加一个侦听器。Firebase中的一切都与听众有关。这意味着您正在监听数据库中特定位置的每一个更改。因此,在任何时候,您都可以从数据库中获得特定节点的< code >数据快照。假设我们有一个如下所示的数据库:

Firebase-root
    |
    --- users
          |
          --- userId1
          |     |
          |     --- //details
          |
          --- userId2
                |
                --- //details

如果我们在用户节点上附加一个侦听器,我们可以创建一个列表,其中包含所有用户,如下所示:

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

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

 类似资料:
  • 我有一个带有此模式的数据库: 我测试了这段代码,但我无法从数据库中获得任何消息。我会感谢你的帮助。

  • 我已经花了几个小时阅读产品分支中的0和1。请在Firebase数据库有经验的人帮助我:(

  • 我正在一个聊天应用程序,其中消息存储在firebase实时数据库。现在,如果我创建一个如下所示的节点(Chats-Better-A-ID和-B-ID是自动生成的聊天室密钥),那么我想知道当用户S在聊天应用程序中打开与用户T聊天时,so数据库将只读取存储在Chats-Better-S-T-ID中的消息,而不会读取其他聊天室消息!?我说的对吗?如果是,那么它会降低定价吗? 或 如果我存储如下所示的数据

  • 我正在尝试读取我的Flutter应用程序中的firebase实时数据库中的数据,并将其分配给模型类,但是,我在控制台中得到了以下错误。 下面是我到目前为止所做的代码 员工类别 我不知道我做错了什么,请帮我解决这个问题

  • 我试图从Firebase数据库中读取数据,我已经到处阅读和查找,但我已经走到了死胡同。 这就是我所做的一切。 依赖项: 实现'com.google.firebase: Firebase存储: 9.2.1' 实现'com。谷歌。firebase:firebase数据库:9.2。1' 实现'com。谷歌。firebase:firebase授权:9.2。1' 实现'com。谷歌。火基:火基核心:9.2。

  • 我目前正在Android中使用静态编程语言进行培训,每当我试图访问Firebase数据库中当前的数据时都会遇到问题。下面是数据库中的数据: 数据库映像 之后,在将应用程序链接到Firebase之后,我刚刚创建了一个包含所有必需导入的主活动,但不幸的是,每当我执行应用程序并按下按钮时,什么都没有发生。 日志没有出现任何时间,它真的很烦人,因为我在留档中搜索,据我所知,这是我应该做的一切(我还检查了数