如果没有检索到数据,则为Firebase ChildEventListener

时间:2017-03-08 11:52:24

标签: android firebase firebase-realtime-database

我在我的应用中使用Firebase。我有一个要使用此代码检索的元素列表:

FirebaseDatabase.getInstance()
.getReferenceFromUrl("myUrl")
.orderByChild("timestamp")
.addChildEventListener(this);

了解ref url内部没有数据的最佳方法是什么?因为无法使用 ChildEventListener

ChildEventListener 只有这四种方法: onChildAdded(),onChildChanged(),onChildRemoved(),onChildMoved()

如果您的对象内部没有项目,则不会调用这些方法。

所以我的问题是。我是否还必须使用 ValueEventListener ? 我想如果没有找到任何项目,就会调用 onDataChange()

可能的情况: 您有一个要使用 ChildEventListener 检索和填充的项目列表。 您想要在没有检索到任何项目时覆盖案例。因此,请显示文本“无数据”而不是列表。

3 个答案:

答案 0 :(得分:1)

据我所知,如果您在addChildEventListeneraddValueEventListener之后直接在相同的数据路径上(在代码中)请求数据,则会得到addChildEventListener的结果首先完成,onDataChange内的ValueEventListener将被执行。

所以我的解决方案是这样做的:

Boolean childExist = false;

ref.addChildEventListener(new ChildEventListener() {
    ... onChildAdded() {
        // you can use List or Map here, this Boolean just to indicate if child exist or not
        childExist = true;
    }
    ...
})
ref.addValueEventListener(new ValueEventListener() {
    ... onDataChange() {
        // code you place here will be executed AFTER all of the event inside ChildEventListener is done
        // here the value of childExist will really indicate if there is child or no
    }
    ...
});

答案 1 :(得分:0)

如果您想要的只是在没有结果时显示“无数据”,您可以将标签的文本值默认设置为“无数据”,并让firebase查询覆盖它。如果没有结果,它就不会被覆盖。

答案 2 :(得分:0)

您始终只能使用valueEventListener和onDataChange来检查datasnapshot.exists()。与此处的javadoc一致 - > https://firebase.google.com/docs/reference/js/firebase.database.DataSnapshot#exists

所以在你的情况下

    FirebaseDatabase.getInstance()
        .getReferenceFromUrl("myUrl")
        .orderByChild("timestamp")
    .addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()){
        //Show text retrieved


         } else {
    //Show "No data"
    }
        }
@Override
public void onCancelled(DatabaseError databaseError) {
 Log.v(FB_ERROR_TAG, "Error in Database Connection");
}
 });