У меня есть база данных firebase в реальном времени, которая выглядит так.

DataBase Snapshot

На изображении на том же уровне, что и эти 3, показано много элементов, включая 3.
Я хочу получить их в Kotlin на основе параметра OrderCount .
Поэтому, когда я беру, я хочу, чтобы Драконий фрукт был 1-м , Черимойя был 2-м , Аки < / strong> на 3-е место и так далее.
Это то, что я пробовал на основе Stackoverflow и других ресурсов.

            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 .

Это код для получения результата. Я также хочу получить только первые 5 результатов после заказа.
Будет ли для этого использоваться атрибут limitToFirst (5) или есть другой способ.
Тот же код, когда я пробовал использовать python, дает отличный результат: Код такой:

ref = db.reference('all_items/Exotic_Fruits').order_by_child("OrderCount").limit_to_first(5)
refData = ref.get()
0
Aniket Bote 31 Май 2020 в 15:09

1 ответ

Лучший ответ

Когда вы запрашиваете упорядоченные данные из Firebase, вы получаете DataSnapshot с результатами. Для каждого совпадающего узла, который содержит:

  1. Ценность узла
  2. Ключ узла
  3. Положение узла относительно других результатов.

Когда вы запрашиваете значение узла в целом (путем вызова value или, как вы это делаете, путем его печати), результаты преобразуются в объект 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}")
        }
    }
})

Также см. Документацию Firebase для списков чтения с прослушивателем значений., откуда у меня петля.

1
Frank van Puffelen 31 Май 2020 в 15:27