Java Android,Firebase-在尝试检索多个子节点时,数据库仅将单个子节点作为字符串返回
我刚刚开始尝试在我的Android应用程序中使用Firebase。我可以将数据写入数据库,但在尝试检索数据时遇到了问题。Java Android,Firebase-在尝试检索多个子节点时,数据库仅将单个子节点作为字符串返回,java,android,database,firebase,firebase-realtime-database,Java,Android,Database,Firebase,Firebase Realtime Database,我刚刚开始尝试在我的Android应用程序中使用Firebase。我可以将数据写入数据库,但在尝试检索数据时遇到了问题。 我的数据库结构如下 我检索数据的方法: public void getCurrentUserData() { FirebaseDatabase database = FirebaseDatabase.getInstance(); FirebaseUser loggedUser = firebaseAuth.getCurrentUser()
我的数据库结构如下
我检索数据的方法:
public void getCurrentUserData() {
FirebaseDatabase database = FirebaseDatabase.getInstance();
FirebaseUser loggedUser = firebaseAuth.getCurrentUser();
String uid = loggedUser.getUid();
DatabaseReference userRef = database.getReference().child("Users").child(uid);
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//crashes because user is not a string
//User user = dataSnapshot.getValue(User.class);
//works because function is returning first child of uID as a string
String user = dataSnapshot.getValue().toString();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
调试时:
dataSnapshot = "DataSnapshot { key = bio, value = test }"
我原以为这会返回uid中包含的所有子节点(bio、dob、firstName、joinDate、lastName、location)并将它们放入我的用户对象中,但实际上它看起来似乎只是以字符串形式返回第一个子节点(bio)。
为什么会发生这种情况?如何检索完整的子节点集?
非常感谢您的帮助。谢谢。如果要获取用户的所有属性,您需要创建一个自定义Java类来表示该用户,或者需要在自己的代码中从各个子快照中读取属性。例如:
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String firstName = dataSnapshot.child("firstName").getValue(String.class);
String lastName = dataSnapshot.child("lastName").getValue(String.class);
...
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // don't ignore errors
}
});
或者,您可以使用以下命令循环属性:
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot propertySnapshot: dataSnapshot.getChildren()) {
System.out.println(propertySnapshot.getKey()+": "+propertySnapshot.getValue(String.class));
}
}
DataSnapshot
应该在侦听器所在的客户端已知的位置包含数据。由于您使用的是addListenerForSingleValueEvent
,因此我立即怀疑这是来自本地磁盘缓存的。那么:你在使用磁盘持久性吗?我不知道?我已更改“bio”中包含的数据并重新运行该应用程序,它总是更新。您可以发布您的用户类吗?可能是其中的某些内容与Firebase不兼容。您的用户类中是否缺少空的默认构造函数?这曾经是我的一个问题。@FrankvanPuffelen海报上说他试图“把它们放到我的用户对象中”。我想他注释掉了这一行,以尝试不会崩溃的字符串版本。但对我来说,他的最终目标似乎是让Firebase返回用户对象。。。我的一个价值观缺失了一个设定者:/谢谢你的帮助