如果firebase url不存在并且我们尝试添加一个监听器会发生什么?

时间:2015-12-25 07:06:21

标签: android firebase

我正在开发一个应用程序,我要求用户输入城市和州名称并返回该地点的某个位置。但问题是,如果指定的州或城市在我的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(); } }); }`

1 个答案:

答案 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()
        }
    }
}