从 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 成为 1stCherimoya 成为 2ndAckee 成为 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 实时数据库时会得到重复值?

在地图上同时显示多个用户的位置(Kotlin、Firebase 实时数据库)

从 Firebase 数据库快照解析布尔值

关闭 Firebase 上的实时更改 (Android)

使用协程的 Firebase 实时快照监听器