为什么 Firebase childEventListener 在与另一个参考一起工作时不能与一个参考一起工作?
Why does the Firebase childEventListener not work with one reference while it works with the other?
参考文献是:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users");
DatabaseReference TUidRef = usersRef.child(td);
td
的值是从前面的activity推导出来的:
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final String dataName = parent.getItemAtPosition(position).toString();
usersdRef.orderByChild("username").equalTo(dataName).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot data: dataSnapshot.getChildren()){
String dataUID = data.child("uid").getValue(String.class);
Log.i("uid",dataUID);
startActivity(new Intent(Main2Activity.this, Main5Activity.class).putExtra("valueName", dataName).putExtra("valueUID",dataUID));
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
});
Bundle bundle = getIntent().getExtras();
td = bundle.getString("valueUID");
childEventListener
可以与 usersRef
一起使用,但不能与 TUidRef
一起使用,它不会崩溃或发生任何事情,它只是什么都不做。
数据库看起来像这样:
我认为您没有正确传递捆绑包尝试更改
td = bundle.getString("valueUID");
到
td = getIntent().getString("valueUID");
分三种情况:
当您使用 ValueEventListener
加载 /users
时,您在 onDataChange
中获得的 DataSnapshot
包含一个用户列表。所以你需要遍历 dataSnapshot.getChildren()
来获取每个用户。
当你查询/users
时,可能有多个符合查询条件的子节点。因此,您在 onDataChange
中获得的 DataSnapshot
也包含一个用户列表,您需要遍历它们。
当您将 ValueEventListener
附加到 /users/$uid
时,您在 onDataChange
中获得的 DataSnapshot
包含单个用户的属性。所以你不再需要遍历 DataSnapshot.getChildren()
:
最后一个案例的代码:
TUidRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String dataUID = data.child("uid").getValue(String.class);
Log.i("uid",dataUID);
startActivity(new Intent(Main2Activity.this, Main5Activity.class).putExtra("valueName", dataName).putExtra("valueUID",dataUID));
}
...
参考文献是:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users");
DatabaseReference TUidRef = usersRef.child(td);
td
的值是从前面的activity推导出来的:
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
final String dataName = parent.getItemAtPosition(position).toString();
usersdRef.orderByChild("username").equalTo(dataName).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot data: dataSnapshot.getChildren()){
String dataUID = data.child("uid").getValue(String.class);
Log.i("uid",dataUID);
startActivity(new Intent(Main2Activity.this, Main5Activity.class).putExtra("valueName", dataName).putExtra("valueUID",dataUID));
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
});
Bundle bundle = getIntent().getExtras();
td = bundle.getString("valueUID");
childEventListener
可以与 usersRef
一起使用,但不能与 TUidRef
一起使用,它不会崩溃或发生任何事情,它只是什么都不做。
数据库看起来像这样:
我认为您没有正确传递捆绑包尝试更改
td = bundle.getString("valueUID");
到
td = getIntent().getString("valueUID");
分三种情况:
当您使用
ValueEventListener
加载/users
时,您在onDataChange
中获得的DataSnapshot
包含一个用户列表。所以你需要遍历dataSnapshot.getChildren()
来获取每个用户。当你查询
/users
时,可能有多个符合查询条件的子节点。因此,您在onDataChange
中获得的DataSnapshot
也包含一个用户列表,您需要遍历它们。当您将
ValueEventListener
附加到/users/$uid
时,您在onDataChange
中获得的DataSnapshot
包含单个用户的属性。所以你不再需要遍历DataSnapshot.getChildren()
:
最后一个案例的代码:
TUidRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String dataUID = data.child("uid").getValue(String.class);
Log.i("uid",dataUID);
startActivity(new Intent(Main2Activity.this, Main5Activity.class).putExtra("valueName", dataName).putExtra("valueUID",dataUID));
}
...