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数据并将其保存到共享首选项会生成null_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android 检索firebase数据并将其保存到共享首选项会生成null

Android 检索firebase数据并将其保存到共享首选项会生成null,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我在firebase上有一个数据库,我想从中检索一些数据,并使用共享首选项将其保存到我的应用程序中。当我试图从另一个activtiy中从共享首选项获取值时,我在获取null之前保存了该值。但是,祝酒词会以正确的价值观出现 我从onCreate()调用getLocDbs() 我尝试了async任务,但后来我读到Firebase本身是异步的 为什么我得到空值 谢谢 public void getLocDbs() { firebaseRef.child("rpi_lox").addList

我在
firebase
上有一个数据库,我想从中检索一些数据,并使用
共享首选项将其保存到我的应用程序中。当我试图从另一个
activtiy
中从
共享首选项
获取值时,我在获取null之前保存了该值。但是,祝酒词会以正确的价值观出现

我从
onCreate()
调用getLocDbs()

我尝试了
async任务
,但后来我读到
Firebase
本身是异步的

为什么我得到空值

谢谢

 public void getLocDbs() {

    firebaseRef.child("rpi_lox").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
                Toast.makeText(Welcomer.this, singleSnapshot.getValue
                        (postObject.class).result, Toast.LENGTH_SHORT).show();
                allLox += singleSnapshot.getValue
                        (rpiLocTemplate.class).locName+ ";";

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    PreferenceManager.getDefaultSharedPreferences(Welcomer.this)
            .edit()
            .putString("ls_locations", allLox).apply();


}
你得走了

PreferenceManager.getDefaultSharedPreferences(Welcomer.this)
        .edit()
        .putString("ls_locations", allLox).apply();
onDataChange
内部,因为网络调用需要一段时间才能完成,并且在收到响应时将调用
onDataChange
,否则您将优先保存null,稍后将接收数据

 public void getLocDbs() {

    firebaseRef.child("rpi_lox").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
                Toast.makeText(Welcomer.this, singleSnapshot.getValue
                        (postObject.class).result, Toast.LENGTH_SHORT).show();
                allLox += singleSnapshot.getValue
                        (rpiLocTemplate.class).locName+ ";";

            }
            PreferenceManager.getDefaultSharedPreferences(Welcomer.this)
            .edit()
            .putString("ls_locations", allLox).apply();
       }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

您已经将字符串声明为
stringalllox
将分配空值,当您执行
+=
时,它将在第一次迭代中作为

`allLox = allLox + otherstuff`
 // allLox = null + otherstuff
因此,将字符串变量声明为

String allLox = "";

或者您可以使用
StringBuilder
同时使用
append
方法来实现效率

您太棒了,非常感谢!一个问题:你知道为什么我的字符串以null开头吗?剩下的很好,我得到了我需要的一切。可能是的,像
String allLox=“”
否则它将是空的,
+=
意味着
allLox=allLoc+其他东西
,我很高兴我能帮上忙一个类似的错误:你能帮我吗?谢谢