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

时间:2017-11-17 15:20:23

标签: android firebase firebase-realtime-database

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

例如,假设我的应用程序列出了数据库中的项目。我是第一次启动我的应用程序。然后"项目1"和"项目2"被创造。 Firebase通知我"项目1"和"项目2",所以我将它们添加到我的应用程序列表中。

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

我搜索了一些例子,但我找到的所有例子都是得到事件,而不是"阅读全部"。

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

2 个答案:

答案 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) {

            }
        });