如何比较Android App中Firebase数据库中的值数组?

时间:2017-01-23 05:30:29

标签: android arrays firebase firebase-realtime-database

我的应用程序有以下JSON结构。

root
 |
 +-- groups
 |      |
 |      +-- $gid
 |            |
 |            +-- uids : [$uid1, $uid2,....,$uidN]
 |           
 |      
 +-- users
       |
       +-- $uid
             |
             +-- name: "<name>",
               status: "<status>",
               avatar: "<url>"

如何查找与指定的uid匹配的gid?

我尝试的方法将所有uid与中间的下划线连接在一起。

String mGroupId = mGroupRef.push().getKey();
mGroupRef.child(mGroupId).setValue(new GroupModel(user1.getUid(), user2.getUid()));

class GroupModel {
    private static final String SEPARATOR = "_";
    private String uids;

    public GroupModel(String uid, String uid1) {
            uids = uid + SEPARATOR + uid1;
    }
}

显然,这不是一件好事。

因为,问题使得找到gid变得非常困难,因为uid的顺序是未定义的。

任何想法或帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

Firebase查询只能包含一个orderBy / filter子句。如果要搜索多个条件,则需要找到一种方法,将条件的值组合到单个属性允许查询的数据模型中。

在您将UID组合成单个字符串的场景中,似乎是最直接的映射。只需按字母顺序排序UID(或任何保证它们始终保持相同顺序的方式),然后连接字符串。

我之前在Best way to manage Chat channels in Firebase中写过这篇文章,其中还包含一个可运行的代码段。

如果某个组由其成员定义(就像在许多聊天场景中一样),那么您可以使用连接的UID作为房间密钥。如果您有许多成员,密钥可能比Firebase允许的时间更长,那么在这种情况下最好使用串联UID的哈希值。

最后:在Firebase数据库中使用数组通常是代码味道。每个用户只能是一个组的成员一次。但是数组可以多次包含相同的UID。当您在阵列上进行contains()调用时,您通常会模仿集合:具有唯一成员的集合。在Firebase数据库中,您可以将集合建模为:

members: {
  uid1: true,
  uid2: true,
  uid3: true
}

通过这种结构,您可以保证每个UID只能出现一次,您不需要代码来确保这一点。仅需要true值,因为Firebase数据库无法存储没有值的密钥。