我想从此节点(“ 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/