# #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)
}
}