【问题标题】:Android Firebase Query with Multiple Keys具有多个键的 Android Firebase 查询
【发布时间】:2018-06-11 19:48:29
【问题描述】:

这样的问题已经被问过了,有些已经回答了。 但我有些困惑,这就是我发布这个问题的原因。在我阅读了有关“如何从 here 构造 firebase 中的数据”的 Firebase 文档后,我在 Google 上搜索并尝试查询用户的 组列表(几天但仍然没有得到了解决方案)。

假设我们已经拥有用户从 /users/{$user_id} 节点参与的 组 ID,我们希望获取 组详细信息list from /groups 由分组 id 列表注释。例如,类似于以下查询。

SELECT * FROM groups WHERE key = "techpioneers" AND key = "womentechmakers";

根据 google 搜索结果和 stackoverflow 的答案,Firebase 不支持多个 where 子句。逐个迭代 /groups/{$groud_id} 节点以获取组详细信息列表也不是一个好方法。

抱歉,问题太长了。请帮助如何使用 Firebase android SDK 从 Firebase 查询具有多个键的此类数据列表。

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    Firebase 实时数据库的缺点之一是其数据结构不灵活。如果您想要执行查看不同数据节点的查询,您几乎总是需要对数据进行非规范化。这样做的好处是

    1. 将您的数据分解成独立的块
    2. 更好地查询统计信息等
    3. 您不必下载大量嵌套数据

    缺点是:

    1. 您的数据需要多个组合查询,例如 user-by-username' or groups-by-user`。
    2. 看起来有点复杂和不直观

    回到你的问题: 给定以下表结构:

    group
        group1
            name:"Best group"
            description: "The best group"
        group2:
            name:"An okay group"
            description: "A decent group"
    user
        user1
             name: "User1"
    
        user2
             name: "User2"
    group-by-user
        user1
             group1: true
             group2: true
        user2
             group2: true
    

    注意我是如何创建一个新表的,它将用户与组相关联,而无需将此信息放在用户表中。这可确保用户表仅用于基本的非关系用户信息。

    要在 Java 中查询它,它看起来像下面这样

    //Get a reference to groups a user is in
           //get a reference
        DatabaseReference groupByUserRef = FirebaseDatabase.getInstance().getReference();
        //get a reference to the join table mentioned above
        groupByUserRef.child("group-by-user").child("user1").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                //This contains a list of group keys associated to the user;
                Iterable<DataSnapshot> groupsByUser = dataSnapshot.getChildren();
                //iterate through the list of group keys associated to the user
                groupsByUser.forEach(groupDatasnapshot -> {
                    String groupId = groupDatasnapshot.getKey();
                    FirebaseDatabase groupReference;
                    DatabaseReference groupRef = FirebaseDatabase.getInstance().getReference();
    
                    //Once the key has been retrieved, do a search in the database to get the group
                    groupRef.child("group").child(groupId).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            //Here is where you will get the groups associated to the user.
                            Group group = dataSnapshot.getValue(Group.class);
                            //Add logic here ..
                        }
    
                        @Override
                        public void onCancelled(DatabaseError databaseError) {
    
                        }
                    });
                });
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
    
            }
        });
    

    编辑 总结 如上所述,您可以看到这是一种非常复杂的方法。 这是实时数据库的一个缺点。如果您想确保不循环键,您可以使用以下选项。

    1. 不要对您的数据进行非规范化,并在user 表中直接获取组信息。这样做的缺点是,当您的群组信息增长时,您必须提取大量数据(其中一些您不需要)。
    2. 使用 firebase cloud firestore - 他们已经设法解决了这里的问题

    【讨论】:

    • 感谢您的回答兄弟@martinomburajr。我想避免迭代组ID并一一获取详细信息的过程,兄弟。那么,一个查询就不可能得到吗?
    • 嘿,我编辑了我的回复来回答你关于循环键的问题
    猜你喜欢
    • 2017-07-31
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 2011-10-04
    • 2017-04-23
    • 1970-01-01
    相关资源
    最近更新 更多