Как запрашивать базу данных firebase и извлекать определенные данные

#kotlin #firebase-realtime-database

#kotlin #firebase-база данных в реальном времени

Вопрос:

Структура базы данных

Если я запрашиваю дочернюю базу Readings данных, у меня есть все элементы, но если я добавляю условие, у меня нет результатов.

Кто-нибудь может помочь мне выполнить запрос, чтобы получить все элементы, имеющие значение "2020-9-23" (это будет выбрано пользователем)?

Спасибо

 mDatabase!!.child("Readings").child("dia").equalTo("2020-9-23").orderByValue().addListenerForSingleValueEvent(object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        
        val data: ArrayList<EnergyReading> = ArrayList()
        if (dataSnapshot != null) {
            for (snapshot: DataSnapshot in dataSnapshot.children) {
                try {
                    data.add(EnergyReading(snapshot.child("reading")))
                } catch (e: Exception) {
                    e.printStackTrace()
                }
            }
            mReadingList = data
            Log.i("ReadingModel","data updated there are "   mReadingList!!.size   " Reading in the list")
        } else {
            throw Exception("data snapshot is null line 31")
        }
    }
  

Ответ №1:

Поскольку dia свойство находится под reading управлением, вам необходимо заказать reading/dia :

 mDatabase!!.child("Readings").orderByChild("reading/dia").equalTo("2020-9-23").addListenerForSingleValueEvent(object : ValueEventListener {
  

Комментарии:

1. Это решение не работает для меня. Возвращает «DataSnapshot{key = dia, value = null }»

2. Извините за это, вам действительно нужно orderByChild() . Запросы в Firebase состоят как минимум из двух этапов: 1) упорядочивание по некоторому значению, существующему в фиксированном местоположении под каждым дочерним узлом с orderBy... помощью , 2) затем фильтрация и ограничение дочерних узлов с equalTo помощью , startAt и / или endAt .

3. Это верно. Мне пришлось удалить последнее значение orderByValue, потому что оно выдавало ошибку. Но теперь это работает. Большое вам спасибо @Frank van Puffelen.