Обновите одно значение внутри карты в базе данных Firestore

# #android #kotlin #google-cloud-firestore

Вопрос:

У меня есть коллекция единиц измерения, в каждой единице есть много полей. Одним из таких полей является карта под названием «Настройки«. Настройки <Строка,Любая>: A-<Строка,Любая>>истина, B-<Строка,Любая>>>ложь, C-<Строка,Любая>>>>»Привет» и т. Д. Я хочу обновить один из них, допустим, я хочу установить C в «Мир».

Мой код:

 suspend fun updateData(unitID: String): Boolean = suspendCoroutine { cont ->
    val firestore = FirebaseFirestore.getInstance()

    firestore.collection("Units").document(unitID).get().addOnCompleteListener { it1 ->
        if (it1.isSuccessful) {
            val settings = it1.result.get("Settings") as? HashMap<String, Any>
            if (settings != null) {
                settings["C"] = "World"

                val map = hashMapOf<String, Any>()
                map["Settings"] = settings
                firestore.collection("Units").document(unitID).update(map).addOnCompleteListener { it2->
                    if (it2.isSuccessful) cont.resume(true)
                    else cont.resumeWithException(it2.exception!!)
                }
            }
        }
        else cont.resumeWithException(it1.exception!!)
    }
}
 

Что я делаю? Я получаю карту, обновляю значение и возвращаю его обратно.
Мой вопрос, это правильный подход, могу ли я просто установить значение, не читая сначала данные?

Комментарии:

1. Пожалуйста, отредактируйте свой вопрос и добавьте структуру своей базы данных в виде скриншота. Кроме того, какова ценность unitID вашей ссылки? Вы получаете какие-либо ошибки?

2. Да,вы можете обновлять данные без чтения после извлечения данных. Если вы передаете правильный UID,никаких проблем . @Тусклый

Ответ №1:

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

Предложение:

Не называй это1, это2 так. используйте полные имена.

Ответ №2:

Нашел его:

 suspend fun updateData(unitID: String): Boolean = suspendCoroutine { cont ->
    val firestore = FirebaseFirestore.getInstance()
    val map = mapOf("Settings.C" to "World")
    firestore.collection("Units").document(unitID).update(map).addOnCompleteListener { updateData ->
        if (updateData.isSuccessful) cont.resume(true)
        else cont.resume(false)
    }
}