我尝试使用以下代码从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的列表,删除的项目现在为空。
我做错了什么?
答案 0 :(得分:0)
This post就是答案,而且它给了我一个优雅的解决方案。
而不是基于返回列表的.size()进行for循环,他建议迭代dataSnapshot.getChildren()的子节点。像这样:
for (DataSnapshot child: dataSnapshot.getChildren()) {
poiList.add(child.getValue(POI.class));
}
我认为这是Firebase团队推荐的优秀人才模式。请小心使用Firebase dataSnapshot对象上的size方法。