如何正确监听FirebaseDatabase中的子项更改

时间:2019-11-18 22:33:10

标签: android firebase kotlin firebase-realtime-database

我正在尝试监听数据库子项的更改,在我的情况下是订单。

下面是我的数据库图片,其中
ODdPag ...是我的客户的uid

Lu-_1A只是.push随机顺序命名

我可以提供我的代码,但它令人困惑且无法正常工作,因为我只能访问Orders,而不能访问其下一个子项。

现在,我想列出我所有的订单和列表器,以更改子项(以订单名称)而不是uid。

我正在使用:

val db = FirebaseDatabase.getInstance.reference
val ref = db.child("/Orders/")

ref.addChildEventListener(object: ChildEventListener {

            override fun onChildAdded(p0: DataSnapshot, p1: String?) {

                ringtone.play()

                itemListTable.clear()
                p0.children.forEach {
                    it.child("order").children.forEach{ item ->
                        val newData = item.getValue(itemListData::class.java) ?: return
                        newData.itemName = item.key!!
                        newData.orderKey = it.key!!
                        itemListTable.add(newData)

                    }
                    val data = it.getValue(itemRowData::class.java) ?: return
                    adapter.add(itemRow(data.phoneNumber,data.time,data.locationLat,data.locationLong,data.optionalAddress,data.optionalNote,data.totalPrice,itemListTable,it.key))
                }
            }


            override fun onChildChanged(p0: DataSnapshot, p1: String?) {

                Log.d("ac1234","$p0")
                    p0.child("order").children.forEach{ item ->
                        Log.d("ac1234","1")
                        val newData = item.getValue(itemListData::class.java) ?: return
                        Log.d("ac1234","2")
                        newData.itemName = item.key!!
                        newData.orderKey = p0.key!!
                        itemListTable.add(newData)}


                    val data = p0.getValue(itemRowData::class.java) ?: return
                    adapter.add(itemRow(data.phoneNumber,data.time,data.locationLat,data.locationLong,data.optionalAddress,data.optionalNote,data.totalPrice,itemListTable,p0.key))

            }
class itemRowData(val phoneNumber :String = "",val time :String = "",val locationLat :Double = 0.0,val locationLong :Double = 0.0,val optionalAddress :String = "",val optionalNote :String = "",val totalPrice :String = "")
class itemListData(var itemName: String = "" ,val totalQuantity: String = "",val totalPrice :Long = 0,var orderKey :String = "")

Logcat:未调用1和2

每次我发送订单时,P0都会显示4行,其中包含所有数据

1 个答案:

答案 0 :(得分:0)

  

我想要所有用户的所有订单,这是我的问题。我无法引用每个(“ / Orders / uid”)来收听子项更改

要获得所有用户的所有订单,应使用ValueEventListener,如以下代码行所示:

val rootRef = FirebaseDatabase.getInstance().reference
val ordersRef = rootRef.child("Orders")
val valueEventListener = object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        for (uidDataSnapshot in dataSnapshot.children) {
            for (orderDataSnapshot in uidDataSnapshot.children) {
                val newData = orderDataSnapshot.getValue(itemListData::class.java)
                itemListTable.add(newData)
            }
        }
    }

    override fun onCancelled(databaseError: DatabaseError) {
        Log.d(TAG, databaseError.getMessage()) //Don't ignore errors!
    }
}
ordersRef.addValueEventListener(valueEventListener)

请参见,为了获得每个用户的每个订单,您应该迭代两次,一次获得uidDataSnapshot,然后再获得orderDataSnapshot对象。