2017-10-04 2 views
0

を削除します。私のテストデータは、元の4つのノードが含まれている場合にこれが正常に動作しますFirebaseノードIは、次のコードでFirebaseから読み取ろうとしてる原因のNullPointerExceptionが

@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()); 
    } 
} 

。しかし、Firebaseコンソールに入って手動でノードを削除すると、アプリがクラッシュします。奇妙なことは、dataSnapshot.getChildrenCount()が3を返すということです。削除を認識するように見えますが、dataSnapshot.getValue(genericTypeIndicator)は、削除されたアイテムが現在nullであるサイズ4のリストを返します。

私は間違っていますか?

+0

コメントは役に立ちません。 [この投稿](https://stackoverflow.com/questions/41501805/delete-an-item-from-firebase-without-crashing-the-app)を参照している場合、それは私の質問とは関係ありません。その質問では、dataSnapshot全体がnullですが、私のケースでは子の1つだけがnullです。 Googleや多数のStackOverflowの投稿ではこの問題について話したことがなかったので、私は質問を投稿しました。私はあなたが悪い一日を過ごしていると仮定し、それがあなたのために回ることを願っています。 – szaske

+0

あなたはあなたの質問で正確に何がnullであるのかを指摘しなかった...とにかく、ええ、私はこの質問について考えていましたが、あなたの質問に答えることができません – Selvin

答えて

0

This post Frank van Puffelenさんが答えですが、それは私に優雅な解決策を与えました。

返されるリストの.size()に基づいてforループを実行する代わりに、彼はdataSnapshot.getChildren()の子を反復処理することを推奨しました。このように:

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

これは、Firebaseチームの良い人が推薦するパターンと推測します。 FirebaseのdataSnapshotオブジェクトのsizeメソッドを使用するだけで十分注意してください。

関連する問題