Android中如何从Cloud Firestore集合获取对象列表?
如何从Cloud Firestore中获取对象列表(listTask字段)
我来帮你搞定这个问题!你日志里看到的那个类似JSON的结构,其实是Firestore Android SDK把数组字段解析成了**List<Map<String, Any>>**类型,而不是JSONArray——这就是为什么你用JSONArray处理会出错的核心原因。Firestore在Android端会自动把文档里的数组转成Java的List,数组里的每个对象则对应一个Map<String, Any>,键就是字段名,值就是对应的数据。
下面给你两种处理方式,从简单直接到规范易维护:
方式1:直接遍历List
你可以直接把document.data["listTask"]强转为List<Map<String, Any>>,然后逐个取出每个task的字段:
db.collection("project").get() .addOnSuccessListener { result -> Log.d(TAG, "onRefresh: loadProject") for (document in result){ if (document.data["owner_id"] == id){ counter++ // 安全强转成List<Map<String, Any>>,避免类型转换异常 val taskList = document.data["listTask"] as? List<Map<String, Any>> taskList?.forEach { taskMap -> val taskId = taskMap["id"] as? Int val taskTitle = taskMap["title"] as? String val taskStatus = taskMap["status"] as? Boolean Log.d(TAG, "Task: id=$taskId, title=$taskTitle, status=$taskStatus") } } } }
方式2:转成实体类(更规范的长期方案)
如果你的项目里经常要处理Task数据,建议定义一个对应的数据类,把Map转成实体类,这样代码更易读、更易维护,也方便后续扩展:
首先定义Task数据类:
data class Task( val id: Int, val title: String, val status: Boolean )
然后在回调里把List<Map>转成List<Task>:
db.collection("project").get() .addOnSuccessListener { result -> Log.d(TAG, "onRefresh: loadProject") for (document in result){ if (document.data["owner_id"] == id){ counter++ val taskList = (document.data["listTask"] as? List<Map<String, Any>>)?.map { taskMap -> Task( id = taskMap["id"] as Int, title = taskMap["title"] as String, status = taskMap["status"] as Boolean ) } // 现在taskList就是类型安全的List<Task>,可以直接使用 taskList?.forEach { task -> Log.d(TAG, "Task: ${task.title}, status: ${task.status}") } } } }
补充说明
你日志里看到的[{id=29356, title=Database, status=false}, ...]其实是Java中List和Map的默认toString()输出格式,看起来像JSON但本质是不同的结构,所以不能用JSONArray来解析,直接用List和Map处理就完全没问题啦。
内容的提问来源于stack exchange,提问作者kharismarizqii
相关产品推荐
相关产品推荐

