Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:为什么firebase数据库中的值没有正确存储?_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android:为什么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()

我用于存储firebase数据库中
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下左边的复选标记来接受它。