从Firebase数据库检索数据时出现NullPointer例外

时间:2019-02-25 14:42:33

标签: android firebase-realtime-database kotlin

我尝试从Firebase数据库检索数据 但我有空指针exeption 这是我的模型代码

class Request {
    var Name: String? = null
    var Phone: String? = null
    var Street: String? = null
    var Home:String?= null
    var Flat:String?=null
    var Status: String?=null  
}

这是我如何检索数据

var mDatabase=FirebaseDatabase.getInstance().reference
mDatabase.addValueEventListener(object : ValueEventListener {
    override fun onCancelled(p0: DatabaseError) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun onDataChange(p0: DataSnapshot) {
        for (d in p0.children) {
            var modelRequest: Request? = d.child("Requests").child(user.toString()).getValue(Request::class.java)
            var ord: Order? =d.child("Orders").getValue(Order::class.java)
            Log.d("loadedList", "ok")
            requestList.add(modelRequest!!)

        }

    }
})

这是我的数据结构

enter image description here

1 个答案:

答案 0 :(得分:0)

您正在查看数据库中的顶级节点(FoodRequests等),然后获取每个节点的Requests子节点。由于没有/Requests/Requests会永远是null

距离应该更近:

override fun onDataChange(snapshot: DataSnapshot) {
    var modelRequest: Request? = snapshot.child("Requests").child(user.toString()).getValue(Request::class.java)
    var ord: Order? =snapshot.child("Orders").getValue(Order::class.java)
    Log.d("loadedList", "ok")
    requestList.add(modelRequest!!)
}

请注意,您现在正在从数据库加载所有数据,然后仅使用RequestsOrders节点。这浪费带宽,因此您实际上只应请求所需的数据。您可以通过附加两个侦听器并等待两者的结果来做到这一点。