android - 如何使用这两个函数在 Firebase- Android 上监听数据

标签 android firebase firebase-realtime-database

我在 Firebase 上的数据是这样的:

"node": {
   "node1": {
      "value1": value,
      "value2": value,
      "subSubNode":{
          //....values....//
       },
   },

"node2": { ... },
  "node3": { ... }
  //...and so on ..//
}

首先:我想从 Firebase 获取所有数据并呈现到我的树中,所以我使用了 addListenerForSingleValueEvent() 函数。

然后:我使用 addChildEventListener() 函数来监听节点或子节点何时更改、删除或添加...

private void getData(Query ref){
    ref.addListenerForSingleValueEvent(new ValueEventListener(){
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            **I render data on my tree here**
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });

    ref.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Log.i(TAG, "onChildAdded");
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            Log.i(TAG, "onChildChanged");
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            Log.i(TAG, "onChildRemoved");
        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {
            Log.i(TAG, "onChildMoved");
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            Log.i(TAG, "onCancelled");
        }
    });
}

但是 addChildEventListener() 函数中的 onChildAdded() 方法总是先运行。对我有什么想法或解决方案吗?我在那个位置正确使用 addChildEventListener() 函数吗?

最佳答案

ChildEventListener 中的方法会针对初始数据 对该数据的后续更改触发。

一旦您调用了 addChildEventListener(),您将会为每个现有的子节点调用 onChildAdded()。您可以使用这些事件来构建初始树。添加初始数据后,随着数据的变化,您将收到对所有 onChild... 方法的调用。

所以不要注册 addListenerForSingleValueEvent() 并简单地从 ChildEventListener 的方法构建树。

或者如果您想单独处理初始数据,您可以使用 event guarantees that Firebase has 之一:

Value events are always triggered last and are guaranteed to contain updates from any other events which occurred before that snapshot was taken.

boolean isInitialValueLoaded = false;
ref.addListenerForSingleValueEvent(new ValueEventListener(){
    public void onDataChange(DataSnapshot dataSnapshot) {
        **I render data on my tree here**
        isInitialValueLoaded = true;
    }

    public void onCancelled(FirebaseError firebaseError) {
    }
});

ref.addChildEventListener(new ChildEventListener() {
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        if (!isInitialValueLoaded) return;
        Log.i(TAG, "onChildAdded");
    }

    public void onChildChanged(DataSnapshot dataSnapshot, String s) {
        if (!isInitialValueLoaded) return;
        Log.i(TAG, "onChildChanged");
    }

    public void onChildRemoved(DataSnapshot dataSnapshot) {
        if (!isInitialValueLoaded) return;
        Log.i(TAG, "onChildRemoved");
    }

    public void onChildMoved(DataSnapshot dataSnapshot, String s) {
        if (!isInitialValueLoaded) return;
        Log.i(TAG, "onChildMoved");
    }

    public void onCancelled(FirebaseError firebaseError) {
        Log.i(TAG, "onCancelled");
    }
});

关于android - 如何使用这两个函数在 Firebase- Android 上监听数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33956849/

相关文章:

firebase - Firebase blaze 计划是否有 Spark 计划配额?

java - Recyclerview 不断加载已删除的项目

javascript - 从对象中获取对象中的键/对值

android - 动画 : fillEnable, fillBefore 文档矛盾;语义包括 fillAfter

android - 使用代码从 PDF 中提取文本

android - 设置安卓 :id for Linear layout component

iOS 相册权限 nativescript

javascript - React 中的 Firebase 查询 - 我可以登录到控制台,但不能在组件中使用

ios - 即使用户删除了 Firebase,它也会存储值(value)

java - Android:用 fragment View 替换 Activity View