【问题标题】:add/overwrite field of type array in Firestore在 Firestore 中添加/覆盖数组类型的字段
【发布时间】:2020-09-23 18:24:13
【问题描述】:

我想在集合中添加一个数组类型的字段。

如果该字段不存在,则创建它。如果存在,则用新的数组值覆盖它。

该字段应称为 macAddress,它的类型为 String 数组

我尝试了以下方法:

val macInput = setting_mac_text.text.toString()
            val macArray = macInput.split(",")
            val macList = Arrays.asList(macArray)
            val data =
                hashMapOf(Pair(FirebaseConstants.USER_MAC_ADDRESS, macArray))
            //save it in firebase
            db.collection(FirebaseConstants.ORGANIZATION)
                .document(orgID + ".${FirebaseConstants.USER_MAC_ADDRESS}")
                .set(FieldValue.arrayUnion(macList))
                .addOnCompleteListener { task ->
                    if (task.isSuccessful) {
                        Log.d(TAG, "successfully inserted")
                    } else {
                        Log.d(TAG, " failed ${task.exception}")
                    }
                }

还尝试像这样插入列表本身和哈希映射

val data = hashMapOf(Pair(FirebaseConstants.USER_MAC_ADDRESS, macArray))
db.collection(FirebaseConstants.ORGANIZATION)
                .document(orgID)
                .set(data))

但它一直给我java.lang.IllegalArgumentException: Invalid data. Nested arrays are not supported

我在这里做错了什么?

【问题讨论】:

    标签: android firebase kotlin google-cloud-firestore


    【解决方案1】:

    你在这里做错了三件事:

    1. FieldValue.arrayUnion() 仅用作字段的值以向该字段添加元素。您现在在第一个示例中使用它的方式,它被视为文档的全部内容。
    2. 带有一个参数的set() 仅用于创建或覆盖整个文档。它不能用于更新现有文档。如果你想要更新,你必须传入 SetOptions 来告诉它合并。或者,您只需使用 update() 修改现有文档。
    3. 处理macArraymacList 的代码未按预期方式工作。您正在创建一个包含一个元素的列表,该元素本身就是一个数组。错误消息告诉您不能有这样的嵌套数组。

    我建议退后一步,简化您的代码,删除所有与 Firestore 无关的活动部分。只需在您的 Firestore 更新中硬编码值,直到更新按您想要的方式工作,然后添加适用于实际值的代码。获得一件简单的事情,然后添加它。如果你得到一个错误,你就会知道你刚刚添加的代码是不正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 2018-06-22
      • 2021-06-04
      • 1970-01-01
      • 2020-11-17
      • 2012-07-01
      • 1970-01-01
      相关资源
      最近更新 更多