【问题标题】:Firebase null pointer exception referencing childFirebase 空指针异常引用子
【发布时间】:2018-01-10 15:41:12
【问题描述】:

我看到一个令人困惑的空指针异常,仅适用于我的 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”)都可以访问。唯一的区别是它们是字符串值,而“日期”是长的。

这怎么可能?

【问题讨论】:

    标签: android firebase-realtime-database


    【解决方案1】:

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

    这意味着你的代码需要通过循环 DataSnapshot.getChildren() 来处理列表:

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

    【讨论】:

    • 做到了!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 2015-07-12
    相关资源
    最近更新 更多