Как получить доступ к спискам внутри объекта переменной, считанной из базы данных Firestore?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как получить доступ к спискам внутри объекта переменной, считанной из базы данных Firestore?

Сообщение Anonymous »

Это вопрос, связанный с анализом данных списка/массива. Я могу создавать и обновлять документы коллекции, а также читать всю коллекцию всех документов. Как только коллекция прочитана, я могу просмотреть результат и проанализировать все поля, за исключением поля sitePages, сохраненного как массив в Firestore Firebase. В переменной sitePages сохранено 10 экземпляров этого массива. Ниже я приложил снимок экрана со структурой базы данных.
Изображение

На следующем снимке экрана показано, как переменная sitePages (List) хранится в переменной SitesList в приложении. Переменная sitepages хранится как "Arrays$ArrayList"
Изображение

Ниже приведен снимок экрана, показывающий, как массив sitePages считывается из базы данных. Переменная sitePages считывается из базы данных как «Объект[10]» из «ArrayList». Как получить доступ к данным в объекте elementData?
Изображение

Как получить доступ к 10 спискам в объекте elementData, содержащимся в результате, и перенести содержимое в список sitePages. Любая помощь будет оценена по достоинству. Если есть альтернативный способ сохранения или чтения данных, я готов изменить и этот код.
Я включил код, который использую для чтения и записи в базу данных. Думаю, я включил достаточное количество.
data class SitesList(
var siteId: Int = 0,
var siteImage: Int = R.drawable.paraglider1,
var siteName: String = "",
var sitePages: List
) {
fun toMap() = mapOf(
"siteId" to siteId,
"siteImage" to siteImage,
"siteName" to siteName,
"sitePages" to sitePages
)
}

data class SitePagesList(
var pageId: Int = 0,
var pageContent: String = "",
var pageImage: String? = null
) {
fun toMap() = mapOf(
"pageId" to pageId,
"pageContent" to pageContent,
"pageImage" to pageImage,
)
}

var sitesList = mutableStateListOf()

init {
getSitesList()
}

fun getSitesList() {
getSitesListFromDb()
}

private fun createOrUpdateSite(site: SitesList) {
// create or update an individual site from SitesList
sitesDb.collection("sites")
.document(site.siteId.toString())
.get()
.addOnSuccessListener {
if (it.exists()) {
it.reference.update(site.toMap())
.addOnSuccessListener {
// completed successfully
}
.addOnFailureListener {
// error handling logic removed
}
} else {
sitesDb.collection("sites")
.document(site.siteId.toString())
.set(site)
}
}
.addOnFailureListener {
// error handling logic removed
}
}

private fun getSitesListFromDb() {
sitesDb.collection("sites")
.get()
.addOnCompleteListener { task ->
if (task.isSuccessful) {
val listOfDocuments = task.result
sitesList.clear()
for (document in listOfDocuments) {
val sitePages = document.data["sitePages"] // used to view contents of the arrayList
@Suppress("UNCHECKED_CAST") val list = SitesList(
siteId = document.data["siteId"].toString().toInt(),
siteImage = document.data["siteImage"].toString().toInt(),
siteName = document.data["siteName"].toString(),
sitePages = document.data["sitePages"] as List
)
sitesList.add(list)
}
} else {
// error handling logic removed
}
}
}

Отредактировано с добавлением комментариев/кода/логов по запросу:
Вот код журнала...
Log.d(TAG, "sitePages => $sitePages")
Log.d(TAG, "list.sitePages => ${list.sitePages}")

Вот результат (извиняюсь за количество текста):

2026-02-06 18:31:50.317 19033-19033 ContentValues com.example.cloudbase D sitePages => [{pageImage=null, pageContent=This ridge site ..., pageId=0}, {pageImage=null, pageContent=От шоссе 1A повернуть на запад..., pageId=1}, {pageImage=null, pageContent=Сайт представляет собой горный хребет и запускается..., pageId=2}, {pageImage=null, pageContent=Верхняя площадка на гребне..., pageId=3}, {pageImage=null, pageContent=Сам сайт обозначен..., pageId=4}, {pageImage=null, pageContent=Даже не думайте..., pageId=5}, {pageImage=null, pageContent=Это Мюллер...!, pageId=6}, {pageImage=null, pageContent=, pageId=7}, {pageImage=null, pageContent=https://www.mullerwindsports.com/, pageId=8}, {pageImage=null, pageContent=Контактное лицо локального сайта:
fly@mullerwindsports.com
1(403)932-6760, pageId=9}]
2026-02-06 18:31:50.317 19033-19033 ContentValues com.example.cloudbase D list.sitePages => [{pageImage=null, pageContent=Этот участок хребта..., pageId=0}, {pageImage=null, pageContent=От шоссе 1A поверните на запад..., pageId=1}, {pageImage=null, pageContent=Этот сайт..., pageId=2}, {pageImage=null, pageContent=Верхняя площадка at..., pageId=3}, {pageImage=null, pageContent=Сам сайт..., pageId=4}, {pageImage=null, pageContent=Даже не думайте..., pageId=5}, {pageImage=null, pageContent=Это Мюллер...!, pageId=6}, {pageImage=null, pageContent=, pageId=7}, {pageImage=null, pageContent=https://www.mullerwindsports.com/, pageId=8}, {pageImage=null, pageContent=Контакт на локальном сайте:
fly@mullerwindsports.com
1(403)932-6760, pageId=9}]

Вот цикл, пытающийся получить доступ переменные в sitePages...
var index = 0
val size = list.sitePages.size
while (index < 10) {
Log.d(TAG, "pageId => ${list.sitePages[index].pageId}")
Log.d(TAG, "pageImage => ${list.sitePages[index].pageImage}")
Log.d(TAG, "pageContent => ${list.sitePages[index].pageContent}")
index++
}

Использование list.sitePages.size дает правильный результат 10, но доступ к "list.sitePages[index].pageId" завершается сбоем.
Я пробовал .toString().toInt() после pageId.
Я также пробовал "list.sitePages.toMutableList()[0]", но это тоже дает сбой.
/>- - -

Вот еще один небольшой пример кода.
Log.d(TAG, "listOf(list.sitePages[index]) => ${listOf(list.sitePages[0])}")
val list2 = listOf(list.sitePages[0])
val tempId = list2[0].pageId

Результат Log.d:
listOf(list.sitePages[index]) => [{pageImage=null, pageContent=This ridge site is ..., pageId=0}]

При выполнении строки «val tempId = list2[0].pageId» происходит сбой приложения.
Значение list2 ниже — из режима отладки.
list2 = {Collections$SingletonList@40522} size = 1
0 = {HashMap@40525} size = 3
"pageImage" -> null
key = "pageImage"
value = null
"pageContent" -> "This ridge site is ..."
key = "pageContent"
value = "This ridge site is ..."
"pageId" -> {Long@40535} 0
key = "pageId"
value = {Long@40535} 0


Подробнее здесь: https://stackoverflow.com/questions/798 ... tore-datab
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»