Firebase Datasnapshot возвращает нулевое значение - PullRequest
0 голосов
/ 30 мая 2020

Я хочу получить это значение из этого узла ("id"), и полученное мной значение равно null. Я искал в Google так много решений, что это могло быть связано с асинхронным способом или чем-то в этом роде, я полагаю?

Это база данных, а выделенный узел - это значение, которое я хотел бы получить:

This is the database, and the highlighted node is the value i would like to get

Это мой код:

            reference = FirebaseDatabase.getInstance().getReference();
            id = null;
            Query lastQuery = reference.child("Donation Request").orderByKey().limitToLast(1);
            lastQuery.addListenerForSingleValueEvent(new ValueEventListener()
            {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot)
                {
                    if (dataSnapshot.child("id").exists())
                    {
                        id = dataSnapshot.child("id").getValue().toString();
                        int index = Integer.parseInt(id) + 1;
                        id = Integer.toString(index);
                        Toast.makeText(getApplicationContext(), "It works!!!", Toast.LENGTH_SHORT).show();
                    }
                    else
                    {
                        id = "1";
                        Toast.makeText(getApplicationContext(), "It doesn't work.", Toast.LENGTH_SHORT).show();
                    }
                }
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError)
                {

                }
            });

Будем признательны, если кто-то может мне помочь!

1 Ответ

0 голосов
/ 30 мая 2020

Когда вы выполняете запрос к базе данных Firebase, потенциально может быть несколько результатов. Итак, снимок содержит список этих результатов. Даже если есть только один результат, снимок будет содержать список из одного результата.

Ваш onDataChange должен обработать этот список, перебирая dataSnapshot.getChildren()):

reference = FirebaseDatabase.getInstance().getReference();
id = null;
Query lastQuery = reference.child("Donation Request").orderByKey().limitToLast(1);
lastQuery.addListenerForSingleValueEvent(new ValueEventListener()
{
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot)
    {
        for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
            if (snapshot.hasChild("id"))
            {
                id = snapshot.child("id").getValue(String.class);
                int index = Integer.parseInt(id) + 1;
                id = Integer.toString(index);
                Toast.makeText(getApplicationContext(), "It works!!!", Toast.LENGTH_SHORT).show();
            }
            else
            {
                id = "1";
                Toast.makeText(getApplicationContext(), "It doesn't work.", Toast.LENGTH_SHORT).show();
            }
        }
    }
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError)
    {
        throw databaseError.toException(); // never ignore errors.
    }
});

Еще несколько примечаний:

  • Любое использование id должно происходить внутри onDataChange или быть вызвано оттуда. В остальном у вас не будет никаких гарантий, что id будет присвоено ожидаемое вами значение.
  • Использование всплывающих окон для отладки неизбежно сбивает с толку. Я настоятельно рекомендую использовать Log.d(...) и друзей, а также изучить вывод (и его порядок) в выводе logcat вашего приложения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...