获取firebase实时数据库中的随机条目

Posted

技术标签:

【中文标题】获取firebase实时数据库中的随机条目【英文标题】:Get random entries in firebase real-time database 【发布时间】:2019-02-27 08:35:53 【问题描述】:

这是我从实时数据库中获取 5 个项目的代码:

val database = FirebaseDatabase.getInstance()
val brandReference = database.getReference("brandGame").limitToFirst(5)
brandReference.addValueEventListener(object : ValueEventListener 
    override fun onDataChange(dataSnapshot: DataSnapshot) 
         dataSnapshot.children.forEach 
            ...
         
    

这就是我的实时数据库的样子:

随机获得 5 件物品的最佳方法是什么?我知道实时数据库中还没有随机函数。

【问题讨论】:

【参考方案1】:

如果您知道brandGame/-reference 中的元素数量,您可以在 1 和 numberOfElements 之间选择 5 个随机数并检索它们。这将导致对数据库的多次调用。

或者,您可以从brandGame/-reference 下载所有内容,然后使用纯 Kotlin 随机选择 5 个元素。但是您必须下载参考中的所有内容,这可能很多。

最好的选择是设置一个执行“选择 5 个随机选项”的云功能 - 逻辑服务器端。 https://firebase.google.com/docs/functions/ 但这需要你写一些js :)

正如您所说,没有内置方法可以从引用中获取随机元素。

【讨论】:

尚未决定。我正在考虑继续使用本地 SQLite 数据库和更新它们的后端。我仍然需要检查使用函数是否是一个可行的解决方案。【参考方案2】:

要获得随机品牌,请在用户端使用以下代码:

val rootRef = FirebaseDatabase.getInstance().reference
val brandGameRef = rootRef.child("brandGame")
val valueEventListener = object : ValueEventListener 
    override fun onDataChange(dataSnapshot: DataSnapshot) 
        val brandCountList = ArrayList<String>()
        for (ds in dataSnapshot.children) 
            val brand = ds.child("brand").getValue(String::class.java)
            brandCountList.add(brand!!)
        

        val brandCount = brandCountList.size
        val randomNumber = Random().nextInt(brandCount)

        val randomBrand = ArrayList<String>()
        randomBrand.add(brandCountList.get(randomNumber)) //Add the brand product to list

        val arrayAdapter = ArrayAdapter(applicationContext, android.R.layout.simple_list_item_1, randomBrand)
        list_view.adapter = arrayAdapter
    

    override fun onCancelled(databaseError: DatabaseError) 
        //Handle exceptions
    

brandGameRef.addListenerForSingleValueEvent(valueEventListener)

【讨论】:

这是一个很好的解决方案。但是,假设我有 2000 个品牌,我只需要 5 个随机品牌,那么这不会是一个更好的解决方案,对吧? 正如我已经说过的,这是一个用户端解决方案,而不是一个服务器端解决方案。如果要在服务器端获取 5 个随机元素,则需要在 Firebase Cloud Functions 中编写一个函数来获取这些元素。 很高兴听到这个消息,不客气!如果您有这种想法,请考虑通过单击左侧投票箭头下方的复选标记来接受它。应将颜色更改为绿色。我会很感激的。谢谢!

以上是关于获取firebase实时数据库中的随机条目的主要内容,如果未能解决你的问题,请参考以下文章

如何从父级及其子级的 Firebase 中获取随机数据 [重复]

如何根据 Angular 6 中的 Firebase 实时数据库中的键获取单个记录

无法从 firebase 回收器视图中的 firebase 实时数据库中获取嵌套数据

如何从 Firebase 实时数据库中获取数据到 Flutter 中的列表中?

如何从 Flutter 中的 Firebase 实时数据库中按 categoryId 获取产品?

如何从 Firebase 中的实时数据库中获取数组