Как получить элементы из списка базы данных на основе заданных критериев

Я разрабатываю приложение для управления счетами Android и хочу получить некоторые указанные данные в списке Android.

Я использовал valueEventListener для этой задачи, но так и не смог получить данные. Как я могу получить эти данные в списке, используя valueEventListener?

XML

<?xml version = "1.0" encoding = "utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android = "http://schemas.android.com/apk/res/android"
    xmlns:app = "http://schemas.android.com/apk/res-auto"
    xmlns:tools = "http://schemas.android.com/tools"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:background = "#ffffff"
    tools:context = ".SubmitReading">


    <android.support.v7.widget.Toolbar
        android:id = "@+id/sr_toolbar1"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:background = "?attr/colorPrimary"
        android:minHeight = "?attr/actionBarSize"
        android:theme = "?attr/actionBarTheme"
        app:layout_constraintEnd_toEndOf = "parent"
        app:layout_constraintStart_toStartOf = "parent"
        app:layout_constraintTop_toTopOf = "parent" />

    <TextView
        android:id = "@+id/textView3"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:layout_marginTop = "12dp"
        android:layout_marginBottom = "8dp"
        android:fontFamily = "@font/notosans_bold"
        android:text = "Submit a Reading"
        android:textColor = "@color/colorAccent"
        android:textSize = "70px"
        app:layout_constraintBottom_toBottomOf = "@+id/sr_toolbar1"
        app:layout_constraintEnd_toEndOf = "parent"
        app:layout_constraintStart_toStartOf = "parent"
        app:layout_constraintTop_toTopOf = "parent"
        app:layout_constraintVertical_bias = "1.0" />

    <ImageButton
        android:id = "@+id/bt_submit_a_reading_back"
        android:layout_width = "52dp"
        android:layout_height = "56dp"
        android:background = "@null"
        android:foreground = "?attr/selectableItemBackground"
        android:src = "@drawable/ic_arrow_back_black_24dp"
        app:layout_constraintEnd_toStartOf = "@+id/textView3"
        app:layout_constraintHorizontal_bias = "0.0"
        app:layout_constraintStart_toStartOf = "@+id/sr_toolbar1"
        app:layout_constraintTop_toTopOf = "parent" />

    <LinearLayout
        android:id = "@+id/linearLayout"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:layout_marginStart = "16dp"
        android:layout_marginTop = "16dp"
        android:layout_marginEnd = "16dp"
        android:orientation = "horizontal"
        app:layout_constraintEnd_toEndOf = "parent"
        app:layout_constraintStart_toStartOf = "parent"
        app:layout_constraintTop_toBottomOf = "@+id/sr_toolbar1">

        <SearchView
            android:id = "@+id/search_address"
            android:layout_width = "match_parent"
            android:layout_height = "match_parent"
            android:queryHint = "Search here">

        </SearchView>

    </LinearLayout>

    <LinearLayout
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:layout_marginStart = "8dp"
        android:layout_marginTop = "68dp"
        android:layout_marginEnd = "8dp"
        android:orientation = "horizontal"
        app:layout_constraintEnd_toEndOf = "parent"
        app:layout_constraintStart_toStartOf = "parent"
        app:layout_constraintTop_toBottomOf = "@+id/linearLayout">

        <ListView
            android:id = "@+id/list_address"
            android:layout_width = "wrap_content"
            android:layout_height = "wrap_content">

        </ListView>

    </LinearLayout>


</android.support.constraint.ConstraintLayout>

Джава

package com.ceb.meterreaderassistant;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;



import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;


import java.util.ArrayList;

public class SubmitReading extends AppCompatActivity {

    private ListView listView;
    private FirebaseDatabase cebDb;
    private DatabaseReference dbRef;


    private ArrayList<String>  arrayList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_submit_reading);

        cebDb = FirebaseDatabase.getInstance();
        dbRef = cebDb.getReference("clients");

        listView = (ListView)findViewById(R.id.list_address);
        final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, arrayList);
        listView.setAdapter(arrayAdapter);


    }
}

Я ожидаю, что результат запроса получит данные clientAddress в виде списка. В настоящее время я не получаю требуемый результат.

Как получить элементы из списка базы данных на основе заданных критериев

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
54
1

Ответы 1

Вам необходимо сделать следующее:

cebDb = FirebaseDatabase.getInstance();
dbRef = cebDb.getReference("clients");

dmyRef.addValueEventListener( new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot){
    if (dataSnapshot.exists()){
      for(DataSnapshot ds : dataSnapshot.getChildren()){
         String address = ds.child("clientAddress").getValue(String.class);
       }
    }
}

@Override
public void onCancelled(DatabaseError databaseError) {

   }
});

Вам нужно прикрепить ValueEventListener, а затем выполнить итерацию внутри прямых дочерних элементов, чтобы иметь возможность получить адрес клиента.

Маленький узел: я предпочитаю .getValue(String.class).getValue().toString(), поскольку: 1) последний выдаст NullPointerException, если свойство не существует, 2) первый выдаст исключение, если свойство существует, но имеет другой тип.

Frank van Puffelen 28.03.2019 14:46

Лол @FrankvanPuffelen, ты всегда говоришь мне эту заметку, а я все время забываю ее изменить. Сейчас поменял, спасибо!

Peter Haddad 28.03.2019 15:21

Другие вопросы по теме