【问题标题】:Retrieving ordered data from firebase real-time database Kotlin从 Firebase 实时数据库 Kotlin 中检索有序数据
【发布时间】:2020-09-18 19:06:48
【问题描述】:

我有一个看起来像这样的实时 Firebase 数据库。

图像中显示了许多元素,其中 3 与这 3 个元素处于同一级别。
我想要做的是根据参数 OrderCount 在 Kotlin 中获取它们。
因此,当我获取时,我希望 Dragon Fruit 成为 1stCherimoya 成为 2ndAckee 成为 3rd 以此类推。
基于 Stackoverflow 和其他资源,这是我尝试过的。

            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”开头的元素,但是当我遍历数据快照时,它打印的第一个元素是我所期望的火龙果。

标签: android firebase kotlin firebase-realtime-database


【解决方案1】:

当您从 Firebase 请求有序数据时,您会收到带有结果的 DataSnapshot。对于每个匹配的节点,它包含:

  1. 节点的值
  2. 节点的键
  3. 节点的位置,相对于其他结果。

当您请求整个节点的值时(通过调用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 文档,我从中获得了循环。

【讨论】:

    猜你喜欢
    • 2019-04-16
    • 2020-12-09
    • 2021-02-06
    • 2017-10-06
    • 1970-01-01
    • 2018-09-11
    • 2019-02-04
    • 2019-05-30
    • 2019-11-28
    相关资源
    最近更新 更多