Java 如何在Firebase中获取整个对象?
我正在使用Firebase数据库创建应用程序这是我的数据结构:Java 如何在Firebase中获取整个对象?,java,android,firebase,firebase-realtime-database,firebase-authentication,Java,Android,Firebase,Firebase Realtime Database,Firebase Authentication,我正在使用Firebase数据库创建应用程序这是我的数据结构: { "teachers" : { "USYSacnOjDR5EAPwljZMHtggN9I2" : { "name" : { "teacher_name" : "Alison" }, "members": { "sIrfMA3bm0R9uj55nDUFpFyabcL2" : true } } }, "users" : {
{
"teachers" : {
"USYSacnOjDR5EAPwljZMHtggN9I2" : {
"name" : {
"teacher_name" : "Alison"
},
"members": {
"sIrfMA3bm0R9uj55nDUFpFyabcL2" : true
}
}
},
"users" : {
"sIrfMA3bm0R9uj55nDUFpFyabcL2" : {
"position" : {
"bpos" : "0"
},
"name" : {
"email" : "m@m.com",
"name" : "John",
"surname" : "Clash"
}
}
因此,现在在RecyclerView
中,我试图显示所有Alison
教师成员,如您所见John Clash
设置为true
。无论如何,当我尝试以这种方式检索用户时:
reference = FirebaseDatabase.getInstance().getReference("teachers").child(teacherkey).child("members");
reference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
User user = dataSnapshot.child("name").getValue(User.class);
result.add(user);
adapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
User user = dataSnapshot.child("name").getValue(User.class);
result.remove(user);
adapter.notifyDataSetChanged();
}
应用程序因NPE而崩溃,datasnapshot密钥有效,它是John的帐户密钥,但快照的值为true
。我如何解决这个问题并从John的数据姓名
和姓氏
@编辑:
以下是我的检索代码:
public void updateList() {
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String userId = ds.getKey();
DatabaseReference userIdRef = FirebaseDatabase.getInstance().getReference().child("users").child(userId);
userIdRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
User user = dataSnapshot.child("name").getValue(User.class);
result.add(user);
adapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
您有两种方法来解决此问题: a、 )在onChildAdded中,如果您得到的值为true,则在数据库中进行另一次搜索,但这次是在“用户”节点中。差不多
newReference = FirebaseDatabase.getInstance().getReference("users").child(dataSnapshot.getKey).child("name")
b、 )在“成员”节点中,写入“John Clash”而不是“true”。此方法目前仍有效,但如果有一天您还需要检索电子邮件地址,您将使用第一种方法解决此问题您有两种方法: a、 )在onChildAdded中,如果您得到的值为true,则在数据库中进行另一次搜索,但这次是在“用户”节点中。差不多
newReference = FirebaseDatabase.getInstance().getReference("users").child(dataSnapshot.getKey).child("name")
b、 )在“成员”节点中,写入“John Clash”而不是“true”。这种方法目前还可以,但如果有一天您还需要检索电子邮件地址,您将使用第一种方法来解决这个问题,您需要查询数据库两次。请参阅下面的代码:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference membersRef = rootRef.child(teachers).child(teacherId).child("members");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String userId = ds.key();
DatabaseReference userIdRef = rootRef.child("users").child(userId);
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
Log.d("TAG", user.getName());
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
userIdRef.addListenerForSingleValueEvent(eventListener);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
membersRef.addListenerForSingleValueEvent(valueEventListener);
要解决这个问题,需要查询数据库两次。请参阅下面的代码:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference membersRef = rootRef.child(teachers).child(teacherId).child("members");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String userId = ds.key();
DatabaseReference userIdRef = rootRef.child("users").child(userId);
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
Log.d("TAG", user.getName());
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
userIdRef.addListenerForSingleValueEvent(eventListener);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
membersRef.addListenerForSingleValueEvent(valueEventListener);
如前所述,json无效,将json结构粘贴到此处,您将看到缺少某些点如前所述,json无效,将json结构粘贴到此处,您将看到缺少某些点选项b。是正确的,选项a。听起来不错,谢谢:)选项b。是正确的,选项a。听起来不错,谢谢:)这应该被标记为答案,这正是你需要的!谢谢@GastónSaillén!看起来不错,但还有一个问题。。所以它看起来很有效,它读取所有特定的用户数据,但是,当要将其置于
recyclerview
应用程序崩溃并显示此错误com.google.firebase.database.DatabaseException:无法将java.lang.String类型的对象转换为类型时,是否确实使用了正确的数据库引用
?删除此子项->.child(“名称”)
。这应该标记为答案,这正是您需要的!谢谢@GastónSaillén!看起来不错,但还有一个问题。。所以它看起来很有效,它读取所有特定的用户数据,但是,当要将其放入recyclerview
应用程序崩溃并显示此错误com.google.firebase.database.DatabaseException:无法将java.lang.String类型的对象转换为类型时,是否确定使用了正确的数据库引用
?删除此子对象->.child(“名称”)
。