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

标签 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;
    }
}

显然,这不是一部好作品。

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

任何想法或帮助将不胜感激。

最佳答案

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

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

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

如果群组由其成员定义(在许多聊天场景中都是如此),那么您甚至可以使用串联的 UID 作为房间 key 。如果您有很多成员,该 key 可能会比 Firebase 允许的长度更长,因此在这种情况下最好使用串联 UID 的哈希值。

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

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

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

关于android - 如何从 Android 应用程序比较 Firebase 数据库中的一组值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41799777/

相关文章:

java - 是否可以使用移动设备和 QRCodes 通过两因素身份验证来实现 OAuth?

java - 无法连接到 smtp 主机 :smtp. gmail.com,端口:465

android - Firebase 消息传递不活动,与 AppMeasurementService 断开连接

android - 屏幕锁定时 HCE 服务是否工作?

ios - 从 UITableView 中删除值会导致崩溃

javascript - Observable 的转换

java - 阿拉伯语到罗马语转换器: ArrayIndexOutOfBounds

javascript - 从长度为 6 的数组中返回 3 个组合的所有组合且该数字不与同一组数字出现的算法

node.js - 在 firestore 中,连接用户调用云函数从云 firestore 获取数据的更好方法是什么?

android - 我无法从 firebase 数据库中提取相应 uid 的数据