Отредактировано: возможно, я недостаточно ясно выразился в своем первоначальном вопросе. Я могу прочитать данные из файла, но не могу извлечь их из полученных данных чтения. В режиме отладки выполнение останавливается на «document.toObject» и приводит к сбою приложения. Как преобразовать содержимое каждого документа в результате в запись в списке? См. пример кода ниже.
_sitesList.clear()
for (document in result) {
val site = document.toObject()
site.let { site ->
_sitesList.add(site)
}
}
Оригинал:
Я могу сохранить и обновить содержимое своего списка в FirebaseFirestore, но не могу прочитать и заполнить результат get() в тот же список. Кажется, он считывает данные в результат, но я не могу извлечь данные из результата в список. Сообщений об ошибках нет, приложение просто вылетает.
Ниже я включил код для сохранения/обновления коллекции (он работает нормально) и код для чтения коллекции. Я также пробовал MutableStateFlow, но безуспешно.
Я пробовал следующее либо целиком, либо в цикле for по элементам, но безуспешно:
.toObjects(SitesList::class.java)
.toObject(SitesList::class.java)
Я также пробовал .addSnapshotListener и .onCompleteListener.
Иногда мне нужно использовать цикл while из трех итераций, чтобы данные можно было прочитать.
Я также безуспешно пытался прочитать отдельный документ
.document("0").
Чего мне не хватает?
data class SitesList(
var siteId: Int,
var siteImage: Int,
var siteName: String,
var sitePages: List
)
data class SitePagesList(
var pageId: Int,
var pageContent: String,
var pageImage: String? = null
)
@HiltViewModel
class SitesViewModel @Inject constructor(
val sitesAuth: FirebaseAuth,
val sitesDb: FirebaseFirestore,
val sitesStorage: FirebaseStorage
) : ViewModel() {
private val _sitesList = mutableStateListOf()
val sitesList = mutableStateListOf()
init {
getSitesList()
}
private fun createOrUpdateSite(siteList: SitesList) {
sitesDb.collection("sites")
.document(siteList.siteId.toString())
.get()
.addOnSuccessListener {
if (it.exists()) {
it.reference.update(siteList.toMap())
.addOnSuccessListener {
}
.addOnFailureListener {
// handle error
}
} else {
sitesDb.collection("sites")
.document(siteList.siteId.toString())
.set(siteList)
}
}
.addOnFailureListener {
// handle error
}
}
private fun getSitesList() {
sitesDb.collection("sites")
.get()
.addOnSuccessListener { result ->
_sitesList.clear()
for (document in result) {
val site = document.toObject()
site.let { site ->
_sitesList.add(site)
}
}
}
.addOnFailureListener {
// error handler
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... tpack-comp