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

问题描述 投票:0回答:1

我正在尝试监听我的数据库子级更改,在我的例子中是订单。

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

Lu-_1A只是

.push
随机顺序命名

我可以提供我的代码,但它很混乱并且不起作用,因为我只能访问订单,而不能访问它的下一个孩子。

现在我想列出我的所有订单和子子项(订单名称)而不是 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行所有数据

android firebase kotlin firebase-realtime-database
1个回答
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
对象。

© www.soinside.com 2019 - 2024. All rights reserved.