2017-01-19 21 views
1
次のように私は私のデータベース内のノードにリスナーを追加してい

を取得しますログは、テストのために、ログプリントは次のようにFirebaseデータベースリスナーは、間違った情報

1月19日08:44:57.547 17531から17531/com.firebase.android D/PROFILE:ffggg @ gmailcom 01-19 08:44:57.547 17531-17531/com.firebase.android D/PROFILE:test22 @ gmailcom 01-19 08:45:15.446 17531-17531/com.firebase.android D/PROFILE:8o93lpc5clhrsrst852nfm2g75 01 -19 08:45:15.446 17531-17531/com.firebase.android D/PROFILE:a18g2u5h525nqthpqsn6askp75 01-19 08:45:15.448 17531-17531/com.firebase.android D/PROFILE:ffggg @ gmailcom 01-19 08:45:15:49:17531-17531/com.firebase.android D/PROFILE:test22 @ gmailcom 01-19 08:45:15.587 17531-17531/com.firebase.android D/PROFILE:8o93lpc5clhrsrst852nfm2g75 01-19 08: 45:15.587 17531-17531/com.firebase.android D/PROFILE:a18g2u5h525nqthpqsn6askp75 01-19 08:45:15.588 17531-17531/com.firebase.android D/PROFILE:ffggg @ gmailcom 01-19 08:45: 15.588 17531-17531/com.firebase .android D/PROFILE:test22 @ gmailcom

今、私は唯一の [email protected]の子供を取得する必要があります(と私は、文字列がnullまたは空でない確認しています)UIDは [email protected]であると仮定。しかしここでは、ノードがuIDでない限り、すべてのノードをrefで取得します(しかし、それらの子は返しません)。私は何千ものレコードを何千も持っていれば、不必要なデータをたくさんダウンロードするので、これは欲しくない。

私は何か間違ったことをしていますか、Listbaseはfirebaseによってこのように実装されましたか?

アップデート1

私はアプリの引き出しからアプリケーションを開くと、それは私がしたいノードの正しい子を取得します。しかし、このアクティビティの中の別のアクティビティに行くと、他のクラスでリッスンしているノードに子を追加し、そのノードをリスンしているクラスに戻って、奇妙な出力が得られます。

pullNewImage = myDB.getReference("testNode"); 
pullNewImage.child(uID).child(randomName).setValue(ServerValue.TIMESTAMP); 

アップデート2

私の更新リスナーコード:

//global var 

ValueEventListener profileListener = null; 

//.... 

profileListener = ref.child(userEmail).addValueEventListener(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 
          Log.d("PROFILE", singleSnapshot.getKey()); 
         } 
        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) {} 
       }); 


//... 
@Override 
     public void onStop() { 
      super.onStop(); 
      if (mAuthListener != null) { 
       auth.removeAuthStateListener(mAuthListener); 
      } 
      if(profileListener != null) 
       ref.removeEventListener(profileListener); 

     } 

答えて

1

使用ref = myDB.getReference("testNode").child(uID);

ここ

は私がノードに追加する他の活動のためのコードです

EDIT:

アクティビティを変更するときに問題が発生していると言われているので、リスナーを停止していない可能性があります。

ValueEventListenerを追加します。ValueEventListener profileListener = null; スレッドを削除します。その後ValueEventListenerにあなたのリスナーを設定します。

profileListener = ref.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
    for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 
     Log.d("PROFILE", singleSnapshot.getKey()); 
    } 
} 

@Override 
public void onCancelled(DatabaseError databaseError) {} 
}); 

その後onStop()方法オーバーライドします:上記は動作しませんが、あなたにも与えることができ、なぜまだ

ないように注意してください:

@Override 
public void onStop() { 
    super.onStop(); 

    if(profileListener != null) 
     ref.removeEventListener(profileListener); 
} 

EDIT 2このショット:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("testNode");

Query profileQ = ref.orderByKey().equalTo(userEmail); 
profileQ.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
    for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 
     Log.d("PROFILE", singleSnapshot.getKey()); 
    } 
} 

@Override 
public void onCancelled(DatabaseError databaseError) {} 
}); 

これが機能する場合は、ValueEventListenerをQueue(ValueEventListenerから継承されたキュー)に置き換える必要があります。 UIDを扱っているので、1つしか返されませんでした...しかし、これがうまくいけば他の方法ではうまくいきません。

+0

私はすでにこれを試してみましたが、あなたのコードでそれを無効にし、同期ではありませんもう一度やり直してみてください。それは動作しません。アプリケーションを起動すると、正しいノードの下にある子どもたちが印刷され、私が望むようなものは何も表示されません。そのとき、別のアクティビティからノードに追加すると、上のブロック引用文に記載されている奇妙な出力が得られます – TerribleCoderSad

+0

なぜスレッド内にリスナーがありますか?リスナーはAsyncを実行します。それ以外の理由がなければ削除します。 –

+0

また、変更を待ち受けたいのですか、一度データを取得したいだけですか? –

0

次を使用し、データを一のショットを取得するには:あなたがしたい場合は

ref = myDB.getReference().child("testnode"); 

または

ref = mDB.getReference("testnode"); 

と:

ref.addListenerForSingleValueEvent(
        new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
    }}); 
+0

私は聞いていることが非常に重要なので、これはオプションではありません – TerribleCoderSad

0

は、このような参照してリスナーを変更してみてください"addValueEventListener"を使用するよりもノードを聴取してください。それ以外の場合は "addListenerForSingleValueイベント "です。

子ノードを参照するリスナーを接続するコードを変更します。 firebaseで

ref.child(uid).addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()){ 
         Log.d("PROFILE", singleSnapshot.getKey()); 
        } 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) {} 
      }); 
0

あなたのデータは、あなたが永続性モードを有効にした場合、

FirebaseDatabase.getInstance().setPersistenceEnabled(false);

Firebase Offline Capabilities

関連する問題