Java Firebase-第三个子项中的getValue返回null
我有一个问题,当我想从firebase获取值时,Java Firebase-第三个子项中的getValue返回null,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我有一个问题,当我想从firebase获取值时,getValue()returnnull DataSnapshot应用程序napshot和DataSnapshot DataSnapshot-在控制台中,我也能在Firebase中正确地看到键和值 数据库结构 调试 DataSnapshot设置-返回键但不返回值(null) 字符串设置键-正确返回字符串键 字符串设置值-返回null 为什么我不能从更深层次的孩子那里得到价值 private void readData(final Validat
getValue()
returnnull
DataSnapshot应用程序napshot
和DataSnapshot DataSnapshot
-在控制台中,我也能在Firebase中正确地看到键和值
数据库结构
调试
DataSnapshot设置
-返回键但不返回值(null)
字符串设置键
-正确返回字符串键
字符串设置值
-返回null
为什么我不能从更深层次的孩子那里得到价值
private void readData(final ValidateJoinInterface validateJoinInterface, final String name, final String password, final String user) {
DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot appleSnapshot : dataSnapshot.getChildren()) {
DataSnapshot setting = appleSnapshot.child(name).child("Settings").child("Password");
String settingKey = (String) appleSnapshot.child(name).child("Settings").child("Password").getKey();
String settingValue = (String) appleSnapshot.child(name).child("Settings").child("Password").getValue();
}
validateJoinInterface.validateJoin(correctName, correctPassword, correctUserId);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e("DTAG", "onCancelled", databaseError.toException());
}
});
}
您可以获得任何值,如:
FirebaseDatabase.getInstance().getReference().child(name).child("Settings").child("Password")
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot messageSnapshot : dataSnapshot.getChildren()) {
Log.d(TAG,"KEY - "+messageSnapshot.getKey() + "VALUE - "+messageSnapshot.getValue());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Crashlytics.logException(databaseError.toException());
sendMessageListener.onSendMessageFailure(databaseError.getMessage());
}
});
假设
name
变量包含一个字符串值,如示例Aa
中所示,并且假设Aa
是Firebase根目录的直接子目录,要解决此问题,请使用以下代码:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference settingsRef = rootRef.child(name).child("Settings");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String name = dataSnapshot.child("Name").getValue(String.class);
String password = dataSnapshot.child("Password").getValue(String.class);
Log.d("TAG", name + " / " + password);
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
settingsRef.addListenerForSingleValueEvent(valueEventListener);
输出将是:
Aa/Aaa
当您获取密钥时,返回什么密钥?您在哪里获取null?返回密钥“Password”,但不返回值“Aaa”,当我尝试从名称{“Settings”{“Password”:“null”}获取值时,我有null,但在站点和应用程序快照上的数据库中我有:name{“Settings”{“Password”:“Aaa”}密码节点后没有任何子节点或值。然后您将不会获得任何值,因此其返回null。谢谢Alex,我需要将appleSnapshot更改为dataSnapshot,现在我可以正确获取值。