从 Firebase 实时数据库 Kotlin 中检索有序数据
Posted
技术标签:
【中文标题】从 Firebase 实时数据库 Kotlin 中检索有序数据【英文标题】:Retrieving ordered data from firebase real-time database Kotlin 【发布时间】:2020-09-18 19:06:48 【问题描述】:我有一个看起来像这样的实时 Firebase 数据库。
图像中显示了许多元素,其中 3 与这 3 个元素处于同一级别。 我想要做的是根据参数 OrderCount 在 Kotlin 中获取它们。 因此,当我获取时,我希望 Dragon Fruit 成为 1st,Cherimoya 成为 2nd,Ackee 成为 3rd 以此类推。 基于 *** 和其他资源,这是我尝试过的。
val refFeatured1 = FirebaseDatabase.getInstance().getReference("/all_items/Exotic_Fruits")
.orderByChild("OrderCount")
refFeatured1.addValueEventListener(object : ValueEventListener
override fun onCancelled(p0: DatabaseError)
Log.d("LoadingActivity", "Error in Fetching all items data : $p0")
return
override fun onDataChange(p0: DataSnapshot)
Log.d("LoadingActivity", "$p0")
)
以下查询的结果为我提供了其他元素。 即使我更改 orderByChild 的参数,此结果也不会改变。
这是获取结果的code。 我还想要的是在订购后只获得前 5 个结果。 是否会使用 limitToFirst(5) 属性来实现此目的或是否有其他方法。 当我从 python 尝试时,相同的代码给了我完美的结果: 代码是:
ref = db.reference('all_items/Exotic_Fruits').order_by_child("OrderCount").limit_to_first(5)
refData = ref.get()
【问题讨论】:
您的问题中中的代码有什么问题?例如:Log
语句中的哪一个打印出与您预期不同的内容?
打印数据快照的日志语句。 ie."Log.d("LoadingActivity", "$p0")".
打印什么?你期待什么?
它返回给我一个错误订单的数据快照。但是,当我通过 for 循环迭代数据快照时,它给了我正确的顺序。例如,我得到以元素“Kiwano”开头的元素,但是当我遍历数据快照时,它打印的第一个元素是我所期望的火龙果。
【参考方案1】:
当您从 Firebase 请求有序数据时,您会收到带有结果的 DataSnapshot
。对于每个匹配的节点,它包含:
-
节点的值
节点的键
节点的位置,相对于其他结果。
当您请求整个节点的值时(通过调用value
或通过打印它),结果将转换为Map
对象。在 map 中,键之间没有顺序,因此顺序信息会丢失。
要维护有关结果顺序的信息,您需要遍历DataSnapshot.children
列表。
val refFeatured1 = FirebaseDatabase.getInstance().getReference("/all_items/Exotic_Fruits")
.orderByChild("OrderCount")
refFeatured1.addValueEventListener(object : ValueEventListener
override fun onCancelled(p0: DatabaseError)
Log.d("LoadingActivity", "Error in Fetching all items data : $p0")
return
override fun onDataChange(dataSnapshot: DataSnapshot)
for (snapshot in dataSnapshot.children)
Log.d("LoadingActivity", "$snapshot")
)
另请参阅 read lists with a value listener 的 Firebase 文档,我从中获得了循环。
【讨论】:
以上是关于从 Firebase 实时数据库 Kotlin 中检索有序数据的主要内容,如果未能解决你的问题,请参考以下文章
当有唯一键 Kotlin 时如何从 Firebase 检索孩子
为啥在使用 kotlin 将数据添加到 firebase 实时数据库时会得到重复值?