2016-09-24 5 views
0

Firebaseデータベースを使用していて、そこからデータを取得しています。データベースにデータがある場合、addChildEventListenerはうまく動作しますが、データベースにデータがない場合は、addChildEventListenerが機能しません。ベロー、これは私のコードです:FirebaseデータベースがaddChildEventListenerと連携していません

mDatabase = FirebaseDatabase.getInstance().getReference().child("music"); 

public void getListMusicFromFirebase() { 
    mDatabase.addChildEventListener(this); 
} 

@Override 
public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
    updateMusic(dataSnapshot); 
} 

@Override 
public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
    updateMusic(dataSnapshot); 
} 

@Override 
public void onChildRemoved(DataSnapshot dataSnapshot) { 
    updateMusic(dataSnapshot); 
} 

@Override 
public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

} 

@Override 
public void onCancelled(DatabaseError databaseError) { 

} 

private void updateMusic(DataSnapshot dataSnapshot) { 
    mListMusic.clear(); 

    for (DataSnapshot snapshot : dataSnapshot.getChildren()) { 
     String title = snapshot.getValue(Music.class).getTitle(); 
     String artist = snapshot.getValue(Music.class).getArtist(); 
     String year = snapshot.getValue(Music.class).getYear(); 
     String duration = snapshot.getValue(Music.class).getDuration(); 
     String uri = snapshot.getValue(Music.class).getUri(); 

     Music music = new Music(title, artist, year, duration, uri); 
     mListMusic.add(music); 
    } 

    if (mListMusic.size() > 0) { 
     bindingListMusic(); 
     return; 
    } 
    mBinding.tvDataEmpty.setText("No data"); 
    mDialog.dismiss(); 
} 

私は私のリストをチェックします。そのサイズが0より大きければ、私はそれをrecyclerviewにバインドし、その反対に、データがないときはデータを持っていると通知しますが、Firebaseデータベースからすべてのデータを削除すると、コードはupdateMusicを実行できません( ) 方法。

助けてください。

+0

Nishant氏は次のように述べています。子イベントは、子が存在する場合にのみ発生します。 UIを「ゼロ状態」で開始するのが最も簡単です。最初から「データが見つかりません」と表示してからデータを取り除きます。 ただし、データなしのケースを明示的に処理したい場合は、余分な 'ValueEvntListener'を添付し、それが子供がいないときを検出するために使用します。 http://stackoverflow.com/questions/39671076/firebase-childeventlistener-return-value-when-path-does-not-existを参照してください。 –

答えて

1

リスナーを開始するには、ファイアベースデータベースに必要なデータが必要です。 AddChildEventリスナーには、アプリケーションの起動時に(またはいつでも)事前に定義された親が必要です。親が存在しない場合、リスナーは決してアタッチまたは開始されません。

これにより、あとで親を追加して子を追加すると応答が返されません。したがって、常にchildEventListenerを追加する親がすでに存在し、その値がnullでないことを確認してください。

これが役に立ちます。

関連する問題