アプリケーションが起動したら、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) {}
});
これについて私が見た推奨事項は、Query
オブジェクトでkeepSynced(true)
を呼び出すことです。
このようにしてみてください。これで解決できない場合は、この部分のソースコードを共有してください。 .。
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) {
}
});
私の推測は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();
}
});