You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:27:35