Android:为什么firebase数据库中的值没有正确存储?
我用于存储firebase数据库中Android:为什么firebase数据库中的值没有正确存储?,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我用于存储firebase数据库中uidchild的值的代码如下: lv.setOnItemClickListener(新的AdapterView.OnItemClickListener(){ @凌驾 public void onItemClick(AdapterView父对象、视图、整型位置、长id){ 字符串数据=(字符串)parent.getItemAtPosition(位置); usersdRef.orderByChild(“用户名”).equalTo(parent.toString()
uid
child的值的代码如下:
lv.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
字符串数据=(字符串)parent.getItemAtPosition(位置);
usersdRef.orderByChild(“用户名”).equalTo(parent.toString()).addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
对于(DataSnapshot数据:DataSnapshot.getChildren()){
String dataUID=data.child(“uid”).getValue(String.class);
toUid=dataUID;
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
意向意向=新意向(Main2Activity.this、Main5Activity.class);
intent.putExtra(“valueName”,数据);
intent.putExtra(“valueUID”,toUid);
星触觉(意向);
}
});
但当我尝试在不同的活动中使用该值时,该值将作为null传递。我获取并使用以下值:
Bundle Bundle=getIntent().getExtras();
断言包!=无效的
最终字符串hName=bundle.getString(“valueName”);
最终字符串td=bundle.getString(“valueUID”);
hName
被完美地存储,但td
被传递为null
firebase数据库如下所示:
这是因为您试图在实际回调之外访问变量
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) {
}
});
}
});
lv.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
字符串数据=(字符串)parent.getItemAtPosition(位置);
usersdRef.orderByChild(“用户名”).equalTo(parent.toString()).addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
对于(DataSnapshot数据:DataSnapshot.getChildren()){
String dataUID=data.child(“uid”).getValue(String.class);
toUid=dataUID;
意向意向=新意向(Main2Activity.this、Main5Activity.class);
intent.putExtra(“valueName”,数据);
intent.putExtra(“valueUID”,toUid);
星触觉(意向);
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
}
});
要解决此问题,请使用以下代码:
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);
}
});
lv.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
字符串数据=(字符串)parent.getItemAtPosition(位置);
字符串uid=FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef=FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef=rootRef.child(“用户”).child(uid);
ValueEventListener ValueEventListener=新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
String dataUID=dataSnapshot.child(“uid”).getValue(String.class);
字符串dataUsername=dataSnapshot.child(“用户名”).getValue(String.class);
意向意向=新意向(Main2Activity.this、Main5Activity.class);
intent.putExtra(“valueUID”,dataUID);
intent.putExtra(“valueName”,dataUsername);
星触觉(意向);
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
Log.d(标记,databaseError.getMessage());
}
};
uidRef.addListenerForSingleValueEvent(valueEventListener);
}
});
您可以使用该用户的
uid
获取该特定用户的引用,而不是查询整个数据库以查找单个用户,这是一种浪费时间和资源的行为。因此,不需要使用getChildren()
方法来循环通过DataSnapshot
对象,因为您可以简单地获得它而无需循环。的确,onDataChange()
方法具有异步行为,所有与意图相关的代码都应该放在回调中。如果您想在外部使用这些值,我建议您查看我的anwser的最后一部分,我在其中解释了如何使用自定义回调。您还可以查看此以更好地理解。参考资料中的parent.toString()
值是多少?@AlexMamo它是活动中所有用户名列表中单击的用户名。嘿,谢谢您的回答,但我确实需要循环并看穿用户名,因为我必须在下一个活动中显示用户名,我将这些用户名放在同一个代码块中,这是有效的。谢谢。为了在其他活动中显示该用户名,无需循环。你只能得到一个数据快照,就是这样。但很高兴听到它起作用了!如果你认为我的答案对你有帮助,请考虑点击VO下左边的复选标记来接受它。