Чтение данных из снимка базы данных Firebase - PullRequest
0 голосов
/ 09 марта 2020

Итак, я пытаюсь сделать снимок моей базы данных и добавить элементы со своим дочерним элементом в строки массива.

My database looks like this

Моя основная деятельность выглядит следующим образом

    private Button mbutton;
    private FirebaseDatabase mFirebaseDatabase;
    private DatabaseReference myRef;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_advanced_search);
        mbutton = findViewById(R.id.button_search);
        mFirebaseDatabase = FirebaseDatabase.getInstance();
        myRef = mFirebaseDatabase.getReference();
        mbutton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                goListener();
            }
        });
    }
    private void goListener() {
        myRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                dataQuery(snapshot);
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });
    }
    private void dataQuery(DataSnapshot snapshot) {
        for (int y = 0; y !=2; y++) {
            for (DataSnapshot ds : snapshot.getChildren()) {
                AdvancedQuery findInfo = new AdvancedQuery();
                findInfo.setName(ds.child(String.valueOf(y)).getValue(AdvancedQuery.class).getName());
                findInfo.setIngredients(ds.child(String.valueOf(y)).getValue(AdvancedQuery.class).getIngredients());
            }
        }
    }
}

И мой файл set и get java выглядит следующим образом

public class AdvancedQuery {
    public String name, ingredients;
    public AdvancedQuery(){ }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getIngredients() {
        return ingredients;
    }
    public void setIngredients(String ingredients) {
        this.ingredients = ingredients;
    }
}

Однако, когда моя программа получает метод dataQuery и пытается получить и установить имя и ингредиенты, она аварий. Может кто-нибудь объяснить, что я сделал неправильно, и есть ли более эффективные способы сделать это с помощью моментального снимка базы данных?

Процесс: in.tva c .akshayejh.firebasesearch, PID: 24798 java .lang.NullPointerException: попытка вызвать виртуальный метод 'java .lang.String in.tva c .akshayejh.firebasesearch.AdvancedQuery.getName ()' для пустой ссылки на объект in.tva c .akshayejh .firebasesearch.AdvancedSearch.dataQuery (AdvancedSearch. java: 140) в in.tva c .akshayejh.firebasesearch.AdvancedSearch.access $ 500 (AdvancedSearch. java: 20) в in.tva c .akshayjh firebasesearch.AdvancedSearch $ 2.onDataChange (AdvancedSearch. java: 115) на com.google.firebase.database.Query $ 1.onDataChange (com.google.firebase: firebase-database @@ 16.0.4: 183) на com.google. .firebase.database.core.ValueEventRegistration.fireEvent (com.google.firebase: firebase-database @@ 16.0.4: 75) на com.google.firebase.database.core.view.DataEvent.fire (com.google.firebase : база данных firebase @@ 16.0.4: 63) на com.google.firebas e.database.core.view.EventRaiser $ 1.run (com.google.firebase: firebase-database @@ 16.0.4: 55) в android .os.Handler.handleCallback (Обработчик. java: 873) в android .os.Handler.dispatchMessage (Обработчик. java: 99) в android .os.Looper.l oop (Looper. java: 193) в android .app.ActivityThread.main (ActivityThread. java: 6669) в java .lang.reflect.Method.invoke (собственный метод) в com. android .internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit. java: 493) по тел. android .internal.os.ZygoteInit.main (ZygoteInit. java: 858)

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Действительно трудно разобрать, что делает ваше ``. Подход idiomati c состоит в том, чтобы читать только узел Recipes, а затем l oop поверх дочерних узлов там с snapshot.getChildren().

Так что-то вроде:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Recipes");

ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        for (DataSnapshot recipeSnapshot: snapshot.getChildren()) {
            AdvancedQuery findInfo = recipeSnapshot.getValue(AdvancedQuery.class);

            ...

        }
    }
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException(); // NEVER ignore errors
    }
}
0 голосов
/ 09 марта 2020

Насколько я вижу, вы нигде не инициализируете myRef, что привело бы к NullPointerException, когда вы делаете myRef.addListenerForSingleValueEvent(....

Если это действительно ошибка, которую вы получаете, обязательно инициализируйте myRef перед ее использованием, например:

myRef = FirebaseDatabase.getInstance().getReference().child("Recipes");

Я не совсем уверен, что .child("Recipes") необходимо, поэтому удалите / измените в соответствии с вашей моделью данных и логикой c вашего кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...