在Cloud Firestore(Android)上侦听具有数组字段的某些查询的更新

发布于 2021-01-30 16:37:37

下图显示了简单聊天应用程序的数据结构。当两个用户想要通信时,会在他们之间创建一个频道。成员字符串数组字段列出了用户名。

我想在登录用户的任何渠道收到消息时通知用户。不知道如何做到这一点。

我尝试下面的查询没有成功。有任何想法吗?

    listenerRegistration2 =
            firebaseFirestore.collection(COLLECTION_CHANNELS)
                    .whereEqualTo("members.0", username)
                    .addSnapshotListener((queryDocumentSnapshots, e) -> {
                        Log.d("myApp", "queryDocumentSnapshots = ");
                    });
关注者
0
被浏览
281
1 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。

    编辑:2018年9月12日

    从开始August 28, 2018,现在可以更新数组成员。更多信息在这里。

    如关于数组的官方文档中所示:

    尽管Cloud Firestore可以存储阵列,但可以it does not support查询阵列成员或更新单个阵列元素。

    因此,不幸的是,您无法使用数组实现此目的。如果您只想获取整个memebers数组,则只需使用一个get()调用,然后再遍历Map如下:

    Map<String, Object> map = documentSnapshot.getData();
    for (Map.Entry<String, Object> entry : map.entrySet()) {
        if (entry.getKey().equals("memebers")) {
            Log.d("TAG", entry.getValue().toString());
        }
    }
    

    但是请注意,即使memebers对象作为数组存储在数据库中,也entry.getValue()将返回ArrayList,而不是array

    这里还有一个解决方法,可以帮助您实现这一目标,但是您需要将memebersarray属性更改为map。因此,一种更好的方法是考虑这种替代数据库结构,其中每个成员都是映射中的键,并且所有值均为true

    memebers: {
        "sister12": true,
        "wow": true
    }
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看