web-dev-qa-db-ja.com

Firebase Android addListenerForSingleValueEventがデータを返さないことがあります

アプリケーションが起動したら、Firebaseデータベースで現在のユーザーの詳細を確認します(そのためのuidを保存しています)。

AddListenerForSingleValueEventをユーザーの参照に添付して、そのデータを読み取ります。

私の問題は、成功も失敗も、値を返さないことがあるということです。

アプリケーションのデータをクリアするだけで解決しますが、もちろんユーザーは再度ログインする必要があります。

SOでいくつかの投稿を読みましたが、解決策が見つかりませんでした。

これが私のコードです:

DatabaseReference newUser =    
FirebaseDatabase.getInstance().getReference("users/"+uid);
newUser.addListenerForSingleValueEvent(new ValueEventListener()     
    @Override
    public void onDataChange(DataSnapshot snapshot) {}

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

これについて私が見た推奨事項は、QueryオブジェクトでkeepSynced(true)を呼び出すことです。

5
John O'Reilly

このようにしてみてください。これで解決できない場合は、この部分のソースコードを共有してください。 .。

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.child("users").child(uid).addListenerForSingleValueEvent(new ValueEventListener() {

    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()){
            final HashMap<String, Object> dataMap = (HashMap<String, Object>) dataSnapshot.getValue();
            for (String key : dataMap.keySet()){
                Object data = dataMap.get(key);
                try{
                    HashMap<String, Object> moneyData = (HashMap<String, Object>) data;
                    Money money = new Money(("", "");
                }catch (ClassCastException cce){
                    try{
                        name = String.valueOf(dataMap.get("username"));
                        email = String.valueOf(dataMap.get("useremail"));
                    }catch (ClassCastException cce2){
                    }
                }
            }                            
        // do something
        }else {
        // when empty data
        }
    }
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
    }
});
1
Anna S.

私の推測はuser/:id 存在しません。エラー出力を再確認してください。

DatabaseReference newUser = FirebaseDatabase.getInstance()
    .getReference("users")
    .child(uid)
    .addListenerForSingleValueEvent(new ValueEventListener()     
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            if (snapshot.exists()) {
                Log.i(TAG, snapshot.val());
            } else {
                Log.e(TAG, "Not found: " + uid);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.e(TAG, databaseError.toString();
        }
    });
0
JP Ventura