我想从此节点(“ id”)检索此值,而我得到的值为null。我用Google搜索了很多解决方案,以至于这可能与异步方式或其他方式有关。

这是数据库,突出显示的节点是我想要获取的值:



这是我的代码:

            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)
                {

                }
            });


如果有人可以帮助我,我将不胜感激!

最佳答案

对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输出中研究输出(及其顺序)。

关于java - Firebase Datasnapshot返回空值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62097658/

10-12 03:39