【问题标题】:Get random entries in firebase real-time database获取firebase实时数据库中的随机条目
【发布时间】: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 件物品的最佳方法是什么?我知道实时数据库中还没有随机函数。

【问题讨论】:

    标签: firebase firebase-realtime-database kotlin


    【解决方案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 中编写一个函数来获取这些元素。
    • 很高兴听到这个消息,不客气!如果您有这种想法,请考虑通过单击左侧投票箭头下方的复选标记来接受它。应将颜色更改为绿色。我会很感激的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 2017-07-06
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多