【问题标题】:Firestore updated values erasing existing onesFirestore 更新的值会删除现有的值
【发布时间】:2020-04-18 23:31:49
【问题描述】:

我的计划是不删除数组中已经存在的值,我有这个数组

products [{

   - 0 
    productPrice : 123
    productName: 32

   - 1 
    productPrice : 432
    productName: 21
]}

现在,我更新数组中元素 0 的价格,以便获取整个数组,编辑价格,然后将数组发送到相同的节点产品,但是当我通过更新执行此操作时,我期待只需触摸并更新价格值,而是 .update 正在删除我的 productName 字段

suspend fun updateProductPrice(position:Int,shopId: String,price: Int,productList:MutableList<Product>): Resource<Unit> {
        productList[position].price = price
        FirebaseFirestore.getInstance().collection("shops").document(shopId).update("products",productList).await()
        return Resource.Success(Unit)
    }

我的产品数据类

data class Products(val productPrice:Int = 0)

现在,我知道我这里没有 productName,但是如果我要更新的整个数组中唯一的东西是价格,我就不需要它,那么,为什么我的更新会删除 productName 如果我告诉我只更新价格值?

另外,我知道添加 productName:String = "" 不会删除它并保持原样,但我的用例需要只触摸该价格元素而不是其他元素,因为我的产品中有更多元素数据类,但如果我也将它们放置在整个文档中,它还会将这些字段添加到我不想要的数组中,因为它会使用我不想更新的默认字段值增加文档大小

有什么提示吗?

【问题讨论】:

    标签: android firebase kotlin google-cloud-firestore


    【解决方案1】:

    您的代码使用您指定的值更新文档中的整个products 字段。由于您为 products 指定的新值仅包含一项,这就是本次更新后文档的最终结果。

    如果您想保留现有值,您需要:

    1. 读取现有文档数据
    2. 从中获取当前数组值
    3. 修改数组
    4. 像现在这样写回修改后的数组。

    【讨论】:

    • 非常感谢坦率!你好温柔
    【解决方案2】:

    但是当我使用 update 执行此操作时,我希望只是触摸并更新价格值,但 .update 正在删除我的 productName 字段

    这是预期的行为,因为您的 productList 被定义为 Product 类型,并且该类本身仅包含一个属性,即 productPrice

    现在,我知道我这里没有productName,但如果我要更新的整个数组中唯一的东西就是价格,我就不需要它,所以,为什么我的更新是擦除productName 如果我告诉我只更新价格值?

    它正在擦除productName,因为您用于更新操作的新对象仅包含一个属性。因此,旧对象(具有两个属性)被仅包含一个属性的新对象覆盖。所以你没有“告诉”只是为了更新价格,你实际上是告诉删除旧对象并添加一个只有一个属性的新对象。

    我知道添加 productName:String = "" 不会删除它并保持原样

    是的,这样你应该继续。

    但我的用例只需要触摸该价格元素而不是其他元素

    在这种情况下,你应该get the entire array as a List of Product class objects,一个包含两个属性且只有一个的类,进行更新并写回文档。

    但如果我也将它们放置在整个文档中,它还会将这些字段添加到我不想要的数组中,因为它会使用我不想更新的默认字段值增加文档大小

    您只需要添加您需要使用的数据即可。如果您担心文档的大小,可以随时使用 FirestoreDocument-Android 库检查最大 1 MiB 配额。

    【讨论】:

    • 谢谢亚历克斯!我做了你在文章中提到的,问题不是获取和修改数组,问题是只更新我的数据库中的期望值,正如你所看到的,我从方法参数 th arraylist 本身得到,我只是编辑具有位置的数组的一个元素的价格,您能否详细说明如何在不擦除任何内容的情况下更新该文档?谢谢你的回答,真的很好,你花时间
    • 我不想在我的文档中添加更多不必要的字段,因为如果我修改数据类添加一个额外的字段 (productName) 如果我要提取的列表没有该元素, update 将使用默认值写入它(这是我不想要的),因为它会无缘无故地增加文档大小,因为我需要更新价格@AlexMamo
    猜你喜欢
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2021-08-29
    • 2019-10-16
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多