2016-12-18 11 views
2

特定の電子メールを持つユーザが存在するかどうかを確認しようとしています。この電子メールを持つユーザーがデータベースにあるため、チェックでfalseの代わりにtrueが返されます。ここでFirebaseが存在するかどうかをチェックすると、falseが返されます。

は、スキーマです:

enter image description here

ここでは、コードです:

final DatabaseReference userRef = FirebaseDatabase.getInstance().getReference().child("users"); 
userRef.orderByChild("email").equalTo("[email protected]").limitToFirst(1).addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     System.out.println(dataSnapshot); //returns { key = users, value = null } 
     if(dataSnapshot.getChildrenCount() > 0) { 
      //user already exists (Never executed) 
     } else { 
      //user doesn't exists (Always executed) 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 
+0

あなたは 'addListenerForSingleValueEvent'の代わりに' addValueEventListener'を使用するとどのような動作が見られますか? –

+0

@ JohnO'Reillyそれは、 'addValueEventListener'を使って変です。しかし、私はなぜだろうか? –

+1

私はキャッシュされたバージョンを返すところがあります( 'setPersistenceEnabled(true)'を呼びますか?)。以下はより良い説明です - http://stackoverflow.com/questions/34486417/firebase-offline-capabilities-and-addlistenerforsinglevalueevent –

答えて

1

setPersistenceEnabled(true)が呼び出された場合は、addListenerForSingleValueEventの使用は返されるデータのローカルにキャッシュされたバージョンではなく最新バージョンを引き起こす可能性がありますが、サーバーから(addValueEventListenerを呼び出すと、最新のバージョンが確実に取得されます)。もう1つのアプローチ、addListenerForSingleValueEventを使用する場合はquery.keepSynced(true);

+0

偉大な答えジョン。私は少し前にこの行動のより広範な説明を書きました。 http://stackoverflow.com/questions/34486417/firebase-offline-capabilities-and-addlistenerforsinglevalueevent/34487195#34487195を参照してください。 –

関連する問題