【问题标题】:Altering Firebase reference depending on whether a node has child or not before loading data在加载数据之前根据节点是否有子节点来更改 Firebase 引用
【发布时间】:2017-01-20 07:17:55
【问题描述】:

我正在尝试在我的子侦听器启动并加载我的数据之前设置我的 Firebase 引用。我知道 onCreate 领先于 onResume,但我下面的代码似乎与它相矛盾,因为我的参考仍然是我在 onResume() 中设置的。似乎我在 onCreate 中设置的内容并没有在我在 onCreate() 中设置的内容之前。

这是为什么呢?

如果另一个节点还没有将用户注册为子节点,我正在尝试从我的数据库中的模板读取。 任何提示将不胜感激。

附言我已经注销了引用,并且 OnResume() 中的登录也先进行。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.services_activity);


    app = FirebaseApp.getInstance();
    database = FirebaseDatabase.getInstance(app);
    auth = FirebaseAuth.getInstance(app);
    storage = FirebaseStorage.getInstance(app);
    username = auth.getCurrentUser().getUid();


    databaseRef = database.getReference("serv_hst");
    servTempltRef = database.getReference("serv_tmplt"); 

    databaseRef.child(username).addChildEventListener(new   ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            //I am trying to set my reference that I will use in OnResume() ..!!

            if (dataSnapshot.hasChildren()) {
                servTempltRef = database.getReference("serv_hst");
            }
        }

        @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(DatabaseError databaseError) {
        }
        });           
        }

@Override
protected void onResume() {
    super.onResume();


    servTempltRef.addChildEventListener(new ChildEventListener() {
        @Override        
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        }

        @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(DatabaseError databaseError) {
        }
    });

【问题讨论】:

    标签: android firebase firebase-realtime-database android-lifecycle


    【解决方案1】:

    只有在从 Firebase 数据库下载数据时,onChildAdded() 中的代码才会异步执行。 所以,之后执行流程将执行 .addChildEventListener() 方法所在的行,它会继续执行下一行... 在您的情况下, onCreate() 没有其他要执行的行。因此,由于 Activity 生命周期,onResume() 方法将在没有您需要的数据的情况下执行。

    【讨论】:

    • 感谢您的评论,已经有一段时间了,那时我还是个新手,不是我现在不是。无论如何欣赏评论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 2017-04-30
    • 2017-03-19
    • 2018-06-02
    • 2022-07-06
    相关资源
    最近更新 更多