Firestore обновил значения, стирая существующие - PullRequest
0 голосов
/ 19 апреля 2020

Я планирую не удалять значения, которые уже существуют в моем массиве, у меня есть этот массив

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 = "" не удалит его и не оставит так, как оно есть, но мой вариант использования требует только прикосновения к этому элементу цены, а не к другим, потому что у меня есть больше элементов в моем классе данных Products, но если я также размещу их, чтобы иметь весь документ, он также будет добавьте те поля в массив, который мне не нужен, потому что он увеличит размер документа со значениями полей по умолчанию, которые я не хочу обновлять

Любая подсказка?

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

, но когда я делаю это с обновлением, я ожидаю просто коснуться и обновить значение цены, но вместо этого .update стирает мое поле productName

Это ожидаемое поведение, так как ваш productList определено как тип Product, и сам класс содержит только одно свойство, которое productPrice.

Теперь я знаю, что у меня нет productName здесь , но мне не нужно иметь его, если единственное, что я буду обновлять во всем массиве, это цена, так почему мое обновление стирает productName, если я сказал просто обновить значение цены?

Это стирает productName, потому что новый объект, который вы используете для операции обновления, содержит только одно свойство. Таким образом, старый объект (с двумя свойствами) перезаписывается новым объектом, который содержит только одно свойство. Таким образом, вы не «сказали» просто обновить цену, вы фактически сказали стереть старый объект и добавить новый только с одним свойством.

Я знаю, что добавление productName: String = " "не сотрет и не оставит, как будто это

Да, таким образом, вы должны go впереди.

, но мой вариант использования требует просто прикоснуться к этой цене элемент, а не другие

В этом случае вы должны получить весь массив в виде списка Product объектов класса , класс которых содержит два свойства и не только один, сделайте обновление и запишите документ обратно.

, но если я также размещу их, чтобы иметь весь документ, он также добавит эти поля в массив, который я не хочу, потому что это увеличит размер документа со значениями полей по умолчанию, которые я не хочу обновлять

Вам нужно только добавить данные, которые вам нужны, и ничего более. Если вас беспокоит размер документа, вы всегда можете проверить максимальную квоту в 1 МБ, используя библиотеку FirestoreDocument- Android.

2 голосов
/ 19 апреля 2020

Ваш код обновляет все поле products в документе, указав указанное вами значение. Поскольку новое значение, которое вы указываете для products, содержит только один элемент, то есть чем заканчивается документ после этого обновления.

Если вы хотите сохранить существующие значения, вам необходимо:

  1. Считать данные существующего документа
  2. Получить текущие значения массива из этого
  3. Изменить массив
  4. Записать измененный массив, как вы делаете сейчас.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...