我用于存储Firebase数据库中uid
子级值的代码如下:
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String data = (String) parent.getItemAtPosition(position);
usersdRef.orderByChild("username").equalTo(parent.toString()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot data: dataSnapshot.getChildren()){
String dataUID = data.child("uid").getValue(String.class);
toUid = dataUID;
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
Intent intent = new Intent(Main2Activity.this, Main5Activity.class);
intent.putExtra("valueName", data);
intent.putExtra("valueUID",toUid);
startActivity(intent);
}
});
但是当我尝试在不同的活动中使用该值时,该值将作为null传递。我获取并使用该值作为:
Bundle bundle = getIntent().getExtras();
assert bundle != null;
final String hName = bundle.getString("valueName");
final String td = bundle.getString("valueUID");
hName
存储得很好,但是td
作为null传递。
firebase数据库如下所示:
答案 0 :(得分:1)
这是因为您试图在实际回调之外访问变量toUid
的值。回调意味着异步,这意味着您不能只在定义后的下一行访问它的结果。您的代码还可以,但是作为一个主意,请在回调方法内而不是在回调本身下访问此变量
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String data = (String) parent.getItemAtPosition(position);
usersdRef.orderByChild("username").equalTo(parent.toString()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot data: dataSnapshot.getChildren()){
String dataUID = data.child("uid").getValue(String.class);
toUid = dataUID;
Intent intent = new Intent(Main2Activity.this, Main5Activity.class);
intent.putExtra("valueName", data);
intent.putExtra("valueUID",toUid);
startActivity(intent);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
});
答案 1 :(得分:0)
要解决此问题,请使用以下代码:
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String data = (String) parent.getItemAtPosition(position);
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("users").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String dataUID = dataSnapshot.child("uid").getValue(String.class);
String dataUsername = dataSnapshot.child("username").getValue(String.class);
Intent intent = new Intent(Main2Activity.this, Main5Activity.class);
intent.putExtra("valueUID",dataUID);
intent.putExtra("valueName", dataUsername);
startActivity(intent);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage());
}
};
uidRef.addListenerForSingleValueEvent(valueEventListener);
}
});
与其查询整个数据库以查找单个用户,不如浪费时间和资源,您可以使用其特定的用户uid
获得该用户的引用。因此,无需使用getChildren()
方法来遍历DataSnapshot
对象,因为您可以简单地获得它而无需循环。的确,onDataChange()
方法具有异步行为,所有与意图有关的代码都应放在回调中。如果要在外部使用这些值,建议您从此 post 中查看anwser的最后一部分,其中我已经解释了如何使用自定义回调来完成。您也可以查看此 video 以获得更好的理解。