【问题标题】:Firebase: Read Data once activity startedFirebase:活动开始后读取数据
【发布时间】:2017-09-26 06:17:35
【问题描述】:

一旦加载了Activity,是否有任何方法可以从Firebase 读取数据。目前我使用的是常规的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 读取数据的方法。我看过其他类似的帖子,但我认为还没有明确的答案。

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    如果不使用侦听器,就无法从 Firebase 数据库中读取数据。谈到 Firebase,一切都与听众有关。确实,在设置值时,我们只需要直接在引用上使用一个名为setValue() 的方法即可。不幸的是,Firebase 中没有方法,比如说getValue(),其作用与setValue() 相同。

    为了解决这个问题,我建议你使用addListenerForSingleValueEvent

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

    【讨论】:

      【解决方案2】:

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

      这不是事实,也是开发人员常见的混淆来源。

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

      来自documentation

      此方法在附加侦听器时触发一次,并且在每次数据(包括子项)发生变化时再次触发。

      【讨论】:

      • 好吧,在那种情况下,有什么方法可以自动加载数据,因为现在我必须点击我的应用程序上的某些内容才能查看数据
      • 您显示的监听器应该立即触发。如果没有,其他事情就会出错。不幸的是,不可能从您共享的代码中说出那是什么。我建议最初从固定路径读取并查看它是否有效,例如mDatabaseReference.child("PublicData").addValueEventListener(...。如果可行,您就知道问题出在位置(可能是 UID)。
      • 你说得对。我扭曲了一些东西,现在它完成了我打算做的事情
      【解决方案3】:

      为此,我使用了不同类型的侦听器 - 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) {
      
                  }
              });
      

      【讨论】:

      • 嗯,它再次以相同的方式工作。我必须按一些东西才能加载数据。它不是自动的
      • 奇怪...对我来说,类似的代码会自动运行-我在启动时从 Firebase 读取数据,并将其放入本地 SQLite,因此应用程序只能继续使用 SQLite...您按什么为了加载数据?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多