【问题标题】:Firebase Datasnapshot returns null valueFirebase 数据快照返回空值
【发布时间】:2020-05-30 04:01:08
【问题描述】:

我想从这个节点(“id”)中检索这个值,我得到的值为空。我用谷歌搜索了很多解决方案,这可能与异步方式或其他方式有关,我猜?

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

这是我的代码:

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

                }
            });

如果有人能帮我解决这个问题,将不胜感激!

【问题讨论】:

    标签: java android firebase-realtime-database null


    【解决方案1】:

    当您对 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 将被分配您期望的值。
    • 使用 toast 进行调试肯定会让人感到困惑。我强烈建议使用Log.d(...) 和朋友,并研究应用程序的 logcat 输出中的输出(及其顺序)。

    【讨论】:

    • 以前我不知道 Datasnapshot 可以返回多个可能的结果。
    猜你喜欢
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多