Firebase:活动开始后读取数据

时间:2017-09-26 06:17:36

标签: android firebase firebase-realtime-database

是否有任何方法可以在加载Firebase后从Activity读取数据。此时我正在使用常规valueEventListener,但为了使其工作,数据库中必须进行某种更改

    mDatabaseReference.child("Users").child(mUser.getUid()).
                       child("Posts").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                arrayOfQuestionForms.clear();
                for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
                    QuestionForm tempQuestionForm = postSnapshot.getValue(QuestionForm.class);
                    arrayOfQuestionForms.add(tempQuestionForm);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

我正在寻找的是一种在不使用监听器的情况下从Firebase读取数据的方法。我看了其他类似的帖子,但我认为还没有明确的答案。

3 个答案:

答案 0 :(得分:2)

如果不使用侦听器,则无法从Firebase数据库中读取数据。在涉及到Firebase时,一切都与听众有关。确实,在设置值时,我们只需要在引用上直接使用名为setValue()的方法。不幸的是,Firebase中没有方法,让我们来看看。说getValue(),其行为方式与setValue()相同。

要解决此问题,我建议您使用addListenerForSingleValueEvent

  

为此位置的数据中的单个更改添加侦听器。该侦听器将使用该位置的数据值触发一次。

答案 1 :(得分:1)

出于这个目的,我使用了不同类型的监听器 - ChildEventListener。它有不同的@Override方法。 onChildAdded方法在第一次调用时(即在活动开始时)返回节点的每个子节点。

注意 - 也许您需要稍微更改对DB的引用(修剪一个层次结构级别),以指向父节点。如果您扩展了数据库结构的快照,我可以看一下。 这是更新的代码(对不起是任何错误 - 我无法测试它没有你的数据库:)

mDatabaseReference.child("Users").child(mUser.getUid()).child("Posts").addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                arrayOfQuestionForms.clear();
                for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
                    QuestionForm tempQuestionForm = postSnapshot.getValue(QuestionForm.class);
                    arrayOfQuestionForms.add(tempQuestionForm);
                }
            }

            @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) {

            }
        });

答案 2 :(得分:1)

  

为了使其工作,数据库中必须进行某种更改

这不是真的,也是开发人员混淆的常见原因。

使用您当前的代码,Firebase将立即开始从服务器读取数据。获得该数据后,它会调用您的onDataChange()

来自documentation

  

此方法在连接侦听器时触发,每次包括子项在内的数据发生更改时再次触发。