【问题标题】:Android: How to write array list of strings in FirestoreAndroid:如何在 Firestore 中编写字符串数组列表
【发布时间】:2019-10-11 12:25:26
【问题描述】:

我需要编写一个简单的集合,其中文档只包含一个字符串数组列表。

usersBlocked
    -blockerID
         - usersBlockedList
               -userID1
               -....
               -userIDN

此时,如果文档已经以这种方式存在,我可以更新列表:(为了测试 porpouses,我手动编写了它)。

val reference = Firebase.firestore
            .collection("usersBlocked")
            .document(userIDBlocker)

reference.update("usersBlocked", FieldValue.arrayUnion(userIDToBlock))
            .addOnSuccessListener { Logger.d("Blocked") }
            .addOnFailureListener { Logger.d(it.localizedMessage) }

正如我所说,如果文档存在,则更新是正确的,但是当没有文档时...我收到此错误:

NOT_FOUND: No document to update: projects/xxxxxx/databases/(default)/documents/usersBlocked/2oLOYbG2z9gRC5VugchEP7ZPpy53

我假设显然不存在,但我不知道如何在文档中编写数组。

我看到了如何保存地图,但不是我需要的。

数据库结构:

【问题讨论】:

  • 上传了 db @Ashish 的图片
  • 如果有任何疑问只是评论,请检查我的答案

标签: android firebase kotlin google-cloud-firestore


【解决方案1】:

首先,您必须确认您当前的userid 有任何可用的文档。像我放的那样放条件。它将检查 id 是否可用。如果 id 不可用。然后它将在您的 usersBlocked 处生成新文档,并使用 uid 和存储数组。

val reference = Firebase.firestore
    .collection("usersBlocked")
    .document(userIDBlocker).get()
        .addOnSuccessListener { documentSnapshot ->
            if (documentSnapshot.exists()) {
                reference.update("usersBlocked", FieldValue.arrayUnion(userIDToBlock))
            } else {
                val userdetail = HashMap<String, Any>()
                var usersBlockedList = arrayListOf<String>()
                usersBlockedList.add(userIDToBlock)
                userdetail["usersBlocked"] = usersBlockedList
                Firebase.firestore.collection("usersBlocked").document(userIDBlocker).set(userdetail)
                        .addOnSuccessListener { success ->

                        }
                        .addOnFailureListener { exception ->
                            Log.e("Data Failed", "To added because ${exception}")
                        }

            }
        }
        .addOnFailureListener { exception ->
        Log.e("Exception", "${exception}")
        }

【讨论】:

  • 工作完美。我错过的一点是您创建哈希图以添加“参数”。谢谢! @Ashish
【解决方案2】:

.update(data) 替换为.set(data, SetOptions.merge()) - 这将创建缺少的文档,否则更新它。

数据将是一张地图:

val data = mapOf(
    "usersBlocked" to FieldValue.arrayUnion(userIDToBlock)
)

文档:https://firebase.google.com/docs/firestore/manage-data/add-data#set_a_document

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 2021-03-04
    相关资源
    最近更新 更多