引用子

时间:2018-01-10 15:41:12

标签: android firebase-realtime-database

我看到Firebase实时数据库引用中只有一个子节点出现令人困惑的空指针异常。

Query query = db.getReference("comments/" + eventId).orderByKey();

query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// This causes a null pointer exception.
Long date = dataSnapshot.child("date").getValue(Long.class);
// ...
}
// ...
}

我设置了一个断点,发现评估以下表达式会返回false。

dataSnapshot.child("date").exists();

调试器为dataSnapshot显示此值:

DataSnapshot { key = c953b8fa-b569-4bc0-9302-3a9b34b22853, value = {0c2fd3e6-e9f1-43ce-a807-06b59e1b00bc={text=this comment is a comment., date=1515593659961, creatorId=gkbZMv2ThMh1xDwKyDP9oUtUIKi2, id=0c2fd3e6-e9f1-43ce-a807-06b59e1b00bc}} }

“日期”显然存在于快照中,并且所有其他孩子(例如“text”,“creatorId”,“id”)都是可访问的。唯一的区别是它们是String值,“date”是长的。

这怎么可能?

1 个答案:

答案 0 :(得分:0)

对Firebase数据库执行查询时,可能会有多个结果。因此快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。

这意味着您的代码需要通过循环DataSnapshot.getChildren()

来处理列表
public void onDataChange(DataSnapshot dataSnapshot) {
  for (DataSnapshot child: dataSnapshot.getChildren()) {
    Long date = child.child("date").getValue(Long.class);
    // ...
  }
  // ...
}