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

时间:2018-04-22 13:22:16

标签: android firebase firebase-realtime-database

我在firebase上有一个数据库,我想要检索一些数据并使用shared preferences将其保存到我的应用中。当我尝试从activtiy获取另一个shared preferences中的值时,我在保存之前保存了。但是吐司会弹出正确的值。

我从onCreate()调用getLocDbs()。

我尝试了async task,但在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();


}

1 个答案:

答案 0 :(得分:1)

你需要移动

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

onDataChange内,因为网络调用将需要一些时间才能完成,并且在收到响应时将调用onDataChange,否则您将优先保存为空并且稍后会收到数据

 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) {

        }
    });

}

Do you have any idea, why my string begins with null?

你已将字符串声明为String allLox;,它将指定空值,当你执行+=时,它将在第一次迭代中追加为空

`allLox = allLox + otherstuff`
 // allLox = null + otherstuff

所以将你的字符串变量声明为

String allLox = "";

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