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

时间:2018-09-23 18:25:23

标签: 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: DataSnapshot) {
         dataSnapshot.children.forEach {
            ...
         }
    }
}

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

And this is how my real-time database looks like

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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

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)