如何从Android应用程序比较Firebase数据库中的值数组?

如何从Android应用程序比较Firebase数据库中的值数组?,android,arrays,firebase,firebase-realtime-database,Android,Arrays,Firebase,Firebase Realtime Database,下面是我的应用程序的JSON结构 root | +-- groups | | | +-- $gid | | | +-- uids : [$uid1, $uid2,....,$uidN] | | +-- users | +-- $uid | +-- name: "<name>",

下面是我的应用程序的JSON结构

root
 |
 +-- groups
 |      |
 |      +-- $gid
 |            |
 |            +-- uids : [$uid1, $uid2,....,$uidN]
 |           
 |      
 +-- users
       |
       +-- $uid
             |
             +-- name: "<name>",
               status: "<status>",
               avatar: "<url>"
显然,这不是一部好作品。

因为,这个问题使得查找gid变得非常困难,因为UID的顺序没有定义


非常感谢您的任何建议或帮助。

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

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

我以前在中写过,其中还包含一个可运行的代码段

如果一个组是由其成员定义的(在许多聊天场景中都是这样),那么您可以使用连接的UID作为房间键。若您有许多成员,那个么该密钥可能会比Firebase允许的长度长,所以在这种情况下,最好使用连接UID的散列

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

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

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

Legendary!,我用UID的散列作为房间钥匙,用一个集合来存储成员。
members: {
  uid1: true,
  uid2: true,
  uid3: true
}