2017-09-26 5 views
0

Activityがロードされると、Firebaseからデータを読み取る方法はありません。この時点で私は定期的にvalueEventListenerを使用していますが、それが動作するためには、私が探しています何データベースFirebase:一度アクティビティが開始されると、データの読み取り

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からデータを読み込むためのいくつかの方法でありますリスナーを使用せずに私は他の同様の記事を見てきましたが、私はこれについてまだ明確な答えはないと思います。

答えて

1

、これは真実ではないと開発者のための混乱の共通ソースデータベース

の変化のいくつかの並べ替えが存在しなければなりません。

現在のコードでは、Firebaseはすぐにサーバーからデータの読み取りを開始します。そのデータを取得すると、onDataChange()が呼び出されます。 documentationから

:リスナーがたびに再び子供を含むデータを、を取り付けているとき

この方法は、一度変更をを引き起こしています。

+0

その場合、データを自動的に読み込む方法はありますか?今すぐデータを見るには、アプリで何かをクリックする必要があります。 –

+0

あなたが表示したリスナーはすぐにトリガーされます。それ以外の場合は間違っている。残念ながら、あなたが共有したコードから何が来たのかは分かりません。最初に固定パスから読み込み、それが動作するかどうかを確認することをお勧めします。例えば、mDatabaseReference.child( "PublicData")。addValueEventListener(... '。)もし動作すれば、問題がその場所にあります) –

+0

あなたは実際に正しいです。私はいくつかのものをねじって、今のところそれは私がやろうとしていたことをします –

0

私は別の種類のリスナー - ChildEventListenerを使用しました。それは異なる@Overrideメソッドを持っています。 onChildAddedメソッドは、最初に呼び出されたとき(つまり、アクティビティ開始時)にノードのすべての子ノードを返します。

注意 - 親ノードを指すように、DBへの参照を少し変更して(1つの階層レベルを元に戻す)必要があるかもしれません。あなたのDB構造のスナップショットを展開した場合、私は見ることができます。何もあなたの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) { 

      } 
     }); 
+0

まあ、同じように再び動作します。私はデータをロードするために何かを押す必要があります。それは自動ではありません –

+0

私は似たようなコードが自動的に動作します - 私は最初にFirebaseからデータを読み込み、ローカルのSQLiteに配置しているので、アプリケーションはSQLiteのみで動作し続けます。データを読み込みますか? – Cadet

0

リスナーを使用せずにFirebaseデータベースからデータを読み取るための方法はありません - は、ここでは、コード(申し訳ありませんがいずれかのタイプミス行われる更新されます。 Firebaseについて言えば、すべてがリスナーです。値を設定するときには、参照に直接setValue()という名前のメソッドを使用する必要があります。残念なことに、Firebaseにはメソッドはありません。は、setValue()と同じように動作します。

これを解決するには、addListenerForSingleValueEventを使用してください。

この場所にあるデータの1回の変更に対してリスナーを追加します。このリスナーは、その場所のデータの値とともに1回トリガーされます。それが動作するためで

関連する問題