【问题标题】:how to listen to many childs in Firebase?如何在 Firebase 中聆听许多孩子的声音?
【发布时间】:2017-05-09 09:36:30
【问题描述】:

我的 Firebase 结构如下所示:

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

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

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

A 怎么能听到多个用户的帖子更新?特别是当用户数量很大并且超过 10 或 20 时。

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    要实现这一点,您需要改造您的数据库。以下是它的实现方法。

    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/

    希望对你有帮助。

    【讨论】:

    • 我喜欢你的解决方案,但这意味着“如果你不能听多个,那就写多个”:)
    • 在 Firebase 中,最重要的规则是尽可能扁平化您的数据。这意味着,如果您想收听多个,请将这些值分组到一个节点下并收听该特定节点。您是对的,在某种程度上,您需要编写多个,但这将使您的应用程序在增长工作时更快。
    • 好像没有其他解决办法了,只好遵守这个限制。
    • 这不是限制,这就是 Firebase 和其他 NoSQL 数据库通常的工作方式。要了解更多信息,请阅读post
    • 那么如果她的分支下只有这些帖子的键,如何显示她可以看到的帖子列表?我的意思是,是的,安娜很容易获得她可以看到的帖子的 id 列表,但是如何让实际帖子显示在列表中?
    【解决方案2】:

    监听价值事件

    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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-26
      • 2012-01-29
      • 2019-05-01
      • 1970-01-01
      相关资源
      最近更新 更多