Firebase节点删除导致NullPointerException

时间:2017-10-04 18:59:17

标签: android firebase firebase-realtime-database

我尝试使用以下代码从Firebase读取数据:

@Override
public void onDataChange(DataSnapshot dataSnapshot){
    long value=dataSnapshot.getChildrenCount();
    Log.d(TAG,"no of children: "+value);

    GenericTypeIndicator<List<POI>> genericTypeIndicator =new GenericTypeIndicator<List<POI>>(){};

    List<POI> poiList=dataSnapshot.getValue(genericTypeIndicator);

    for(int i=0;i<poiList.size();i++){
        Log.d(TAG, "onDataChange: content"+ poiList.get(i).getName());
    }
}

当我的测试数据包含原始的4个节点时,这可以正常工作。但是,当我进入Firebase控制台并手动删除节点时,我的应用程序崩溃了。奇怪的是,dataSnapshot.getChildrenCount()返回3 ...因此它似乎识别出删除,但dataSnapshot.getValue(genericTypeIndicator)返回一个大小为4的列表,删除的项目现在为空。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

Frank van Puffelen的

This post就是答案,而且它给了我一个优雅的解决方案。

而不是基于返回列表的.size()进行for循环,他建议迭代dataSnapshot.getChildren()的子节点。像这样:

for (DataSnapshot child: dataSnapshot.getChildren()) {
    poiList.add(child.getValue(POI.class));
}

我认为这是Firebase团队推荐的优秀人才模式。请小心使用Firebase dataSnapshot对象上的size方法。