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

在firebase实时数据库中获取随机条目,firebase,firebase-realtime-database,kotlin,Firebase,Firebase Realtime Database,Kotlin,这是我从实时数据库中获取5项的代码: val database = FirebaseDatabase.getInstance() val brandReference = database.getReference("brandGame").limitToFirst(5) brandReference.addValueEventListener(object : ValueEventListener { override fun onDataChange(dataSnapshot: Da

这是我从实时数据库中获取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件物品的最佳方式是什么?我知道实时数据库中还没有随机函数。

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

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

最好的选择是设置一个云函数来执行“选择5个随机选项”-逻辑服务器端。但这需要编写一些js:)


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

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

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)
val rootRef=FirebaseDatabase.getInstance().reference
val brandGameRef=rootRef.child(“brandGame”)
val valueEventListener=对象:valueEventListener{
覆盖数据更改(dataSnapshot:dataSnapshot){
val brandCountList=ArrayList()
for(dataSnapshot.children中的ds){
val brand=ds.child(“brand”).getValue(字符串::class.java)
brandCountList.add(品牌!!)
}
val brandCount=brandCountList.size
val randomNumber=Random().nextInt(brandCount)
val randomBrand=ArrayList()
randomBrand.add(brandCountList.get(randomNumber))//将品牌产品添加到列表中
val arrayAdapter=arrayAdapter(applicationContext,android.R.layout.simple\u list\u item\u 1,随机品牌)
list_view.adapter=arrayAdapter
}
覆盖已取消(databaseError:databaseError){
//处理异常
}
}
brandGameRef.addListenerForSingleValueEvent(valueEventListener)

尚未决定。我正在考虑继续使用本地SQLite数据库和后端来更新它们。我还需要检查使用函数是否是一个可行的解决方案。这是一个很好的解决方案。但是,让我们先看看我有2000个品牌,我只需要5个随机品牌,所以这不是一个更好的解决方案,对吗?正如我已经说过的,这是一个用户端解决方案,而不是服务器端解决方案。如果你想在服务器端获得5个随机元素,你需要在Firebase云函数中编写一个函数来获得这些元素。很高兴听到这个消息,不客气!如果你这样想,请考虑通过点击投票箭头左侧的勾选来接受它。应该把颜色改成绿色。我会很感激的。谢谢