如何在Firebase听很多孩子?

时间:2017-05-09 09:36:31

标签: android firebase firebase-realtime-database

因此,我的Firebase结构如下所示:

firebase-url/users/
                 /user-id/
                      posts
                      profile
                      relations
                 /user-id/
                      posts
                      profile
                      relations

每个用户都有自己的帖子,假设有2个用户。用户 A B 。 如果A与B有关系,那么两者都可以看到彼此的帖子并听取更新。 A听B帖时情况很简单,但A可能与B,C,D等其他用户有 n关系

我检查了其他线程,例如thisthis,但是对于我的问题没有一个明确的简单解决方案,例如第一个线程是关于监听恒定数量的子节点,这不是很大问题。

A 如何收听多个用户帖子更新?特别是当用户数量大且超过10或20时。

2 个答案:

答案 0 :(得分:3)

要实现此目的,您需要重新构建数据库。这是如何做到的。

firebase-url
    |
    --- users
    |     |
    |     ---- userId_1
    |     |       |
    |     |       ---- userName: "John"
    |     |       |
    |     |       ---- userAge: 30
    |     |       |
    |     |       ---- posts
    |     |              |
    |     |              ---- post_1 : true
    |     |              |
    |     |              ---- post_2 : true
    |     |
    |     ---- userId_2
    |             |
    |             ---- userName: "Anna"
    |             |
    |             ---- userAge: 25
    |             |
    |             ---- posts
    |                    |
    |                    ---- post_3 : true
    |                    |
    |                    ---- post_4 : true
    |
    ---- posts
           |
           ---- postId_1
                   |
                   ---- postName: "post_1"
                   |
                   ---- users
                          |
                          ---- userId_1: true
                          |
                          ---- userId_2: true

通过这种方式,您可以非常简单地查询数据库,以显示有权访问单个帖子的所有用户:firebase-url/posts/postId/users/以及用户可以阅读的所有帖子:firebase-url/users/userId/posts/

希望它有所帮助。

答案 1 :(得分:0)

倾听价值事件

ValueEventListener onDataChange()读取并侦听路径的整个内容的更改。

您可以使用onDataChange()方法读取给定路径中内容的静态快照,因为它们在事件发生时存在。连接侦听器时会触发此方法,每次包括子项在内的数据发生更改时,都会触发此方法。事件回调传递一个快照,其中包含该位置的所有数据,包括子数据。如果没有数据,则返回的快照为空。

ValueEventListener postListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        // Get Post object and use the values to update the UI
        Post post = dataSnapshot.getValue(Post.class);
        // ...
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        // Getting Post failed, log a message
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
        // ...
    }
    };
mPostReference.addValueEventListener(postListener);