我正在开发一个应用程序,我要求用户输入城市和州名称并返回该地点的某个位置。但问题是,如果指定的州或城市在我的Firebase中不存在,那么我的进度对话框(我应该在侦听器触发时解除)继续移动,不会再触发任何操作。
以下是我的代码的一部分:
// state =来自用户 // city =从用户获取
mapProgress.show();
firebase.child("markers").child(state).child(city).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(final DataSnapshot dataSnapshot, String s) {
mapProgress.dismiss();
if (dataSnapshot.exists()) {
//do something
}
else
Toast.makeText(MainActivity.this, "No data found!", Toast.LENGTH_SHORT).show();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(FirebaseError firebaseError) {
mapProgress.dismiss();
Toast.makeText(MainActivity.this, "Cancelled.", Toast.LENGTH_SHORT).show();
}
});
}`
答案 0 :(得分:7)
添加,更改,删除或移动子项时,将调用ChildEventListener
中的方法。在空位置,这些事件都不会发生,因此不会调用任何方法。
如果某个位置不存在值,则会使用空值调用ValueEventListener
。因此,如果您还调用addListenerForSingleValueEvent()
,则可以检测到该位置没有值:
Firebase cityRef = firebase.child("markers").child(state).child(city);
cityRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if (snapshot.getValue() == null) {
System.out.println("No data exists for "+city);
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
如果你想在同一个电话中处理孩子,你可以在onDataChange()
中循环播放:
public void onDataChange(DataSnapshot snapshot) {
if (snapshot.getValue() == null) {
System.out.println("No data exists for "+city);
}
else {
for (DataSnapshot citySnapshot: snapshot.getChildren()) {
// Do something with citySnapshot.getValue()
}
}
}