创建Bypasses列表时应用崩溃,Firebase类型转换异常求助
问题
我需要在CardView中创建Bypasses列表,以下是尝试向byPassesList添加数据的代码:
val bypassListener = object : ValueEventListener { override fun onDataChange(dataSnapshot: DataSnapshot) { val bypassList: MutableList<Bypass> = mutableListOf() for (employeeSnapshot in dataSnapshot.children) { val employeeEmail = employeeSnapshot.key.toString() for (streetSnapshot in employeeSnapshot.children) { val streetName = streetSnapshot.key.toString() for (bypassSnapshot in streetSnapshot.children) { val houseNumber = bypassSnapshot.key.toString() val bypass = bypassSnapshot.getValue(Bypass::class.java) bypass?.let { it.userEmail = employeeEmail ?: "" it.street = streetName ?: "" it.houseNumber = houseNumber ?: "" bypassList.add(it) } } } } val recyclerView = binding.rvBypasses val layoutManager = LinearLayoutManager(this@BypassesList) layoutManager.orientation = LinearLayoutManager.VERTICAL recyclerView.layoutManager = layoutManager val adapter = BypassAdapter(bypassList) recyclerView.adapter = adapter } override fun onCancelled(databaseError: DatabaseError) { Toast.makeText(applicationContext, "Ошибка бд", Toast.LENGTH_SHORT).show() } } val bypassesRef = FirebaseDatabase.getInstance().getReference("Bypasses") bypassesRef.addValueEventListener(bypassListener)
启动Bypasses列表页面时应用崩溃,Logcat日志如下:
FATAL EXCEPTION: main
Process: com.example.sellerhelper, PID: 4295
com.google.firebase.database.DatabaseException: Can't convert object of type java.util.ArrayList to type com.example.sellerhelper.Bypass
Bypass类定义:
data class Bypass( var userEmail: String = "", var street: String = "", var houseNumber: String = "" )
请问该如何解决?是否需要修改Bypass类?我曾尝试将字段类型改为ArrayList,但没有效果。
解决方案
1. 排查Firebase数据库结构
崩溃核心原因:代码试图将bypassSnapshot对应的节点解析为Bypass对象,但该节点实际存储的是ArrayList类型数据。你需要先确认Firebase中Bypasses/{employeeEmail}/{streetName}下的节点结构——如果houseNumber对应的节点是数组而非单个对象,就会触发该错误。
2. 调整代码适配数组类型节点
如果bypassSnapshot确实是ArrayList结构,修改内层循环的解析逻辑:
for (bypassSnapshot in streetSnapshot.children) { val houseNumber = bypassSnapshot.key.toString() // 用GenericTypeIndicator获取ArrayList类型数据 val bypassArray = bypassSnapshot.getValue(object : GenericTypeIndicator<ArrayList<Bypass>>() {}) bypassArray?.forEach { bypass -> bypass.userEmail = employeeEmail ?: "" bypass.street = streetName ?: "" bypass.houseNumber = houseNumber ?: "" bypassList.add(bypass) } }
3. 修正数据库结构(若设计有误)
如果你的预期是每个houseNumber节点存储单个Bypass对象,那数据库结构应该是这样:
Bypasses ├─ employee1@mail.com │ ├─ MainStreet │ │ ├─ 123 │ │ │ ├─ userEmail: "employee1@mail.com" │ │ │ ├─ street: "MainStreet" │ │ │ └─ houseNumber: "123" │ │ └─ 456 │ │ ├─ ...
这种情况下,原代码的解析逻辑是正确的,你需要检查是否有节点错误地存储为数组。
4. 无需修改Bypass类
你的Bypass类定义完全符合需求,不需要改成ArrayList类型,问题根源是数据结构与解析逻辑不匹配。
内容的提问来源于stack exchange,提问作者Shape

