【问题标题】:SharedPreferences putting in null values inside ValueEventListenerSharedPreferences 在 ValueEventListener 中放入空值
【发布时间】:2018-11-27 20:58:28
【问题描述】:

我正在尝试在我的 Firebase 数据库中找到正确节点的匹配项并将值保存到 SharedPreferences。我使用 ValueEventListener 遍历 Firebase 中的每个节点。但是,当我尝试打印出刚刚放入 SharedPreferences 的值时,所有字段都显示为 null。

我已经通过检查commit()的值来检查是否有异常,但是它返回true。

我还认为可能是线程在稍后完成其任务,所以我在 foreach 循环中创建了一个可运行对象并创建了同步任务。第一个将值保存到 SharedPreferences,下一个打印值。但这也没有用。

我还认为这可能是上下文不一致的问题,但“sharedpref”和“editor”都使用相同的活动上下文。而且我在其他活动中访问我想要的数据也没有问题。

这里是我遍历我的 Firebase 节点的地方:

final String name = et_name.getText().toString();
DatabaseReference rootref = FirebaseDatabase.getInstance().getReference();
rootref.child("drivers_" + sharedPref.getString("frat_code", null))
    .orderByChild("first_name")
    .addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            boolean found = false;
            iterateFirebase:
            for(DataSnapshot node: dataSnapshot.getChildren()) {
                Driver driver = node.getValue(Driver.class);
                if((driver.getName() != null) && (driver.getName().equals(name))) {
                    found = true;
                    editor.putString(driver.getName(), "name");
                    editor.putString(driver.getOccupants(), "occupants");
                    editor.putString(driver.getPhone(), "phone");
                    editor.putString(driver.getMake(), "make");
                    editor.putBoolean("isLogged", true);
                    editor.apply();
                    Log.d(TAG, "Values retrieved from Firebase node: " +
                        driver.getName() + ", " + driver.getOccupants() +
                        ", " + driver.getMake() + ", " +
                        driver.getPhone());
                    Log.i(TAG, "Following user logged in: " +
                        sharedPref.getString("name", null) + ", " +
                        sharedPref.getString("occupants", null) +
                        ", " + sharedPref.getString("phone", null) +
                        ", " + sharedPref.getString("make", null) +
                        ", " + sharedPref.getBoolean("isLogged",
                            false));
                    Intent intent = new Intent(IfYes.this,
                        MainActivity.class);
                    IfYes.this.startActivity(intent);
                    break iterateFirebase;
                }
            }

以下是上述日志语句的日志:

Values retrieved from Firebase node: John Smith, 4, Honda Civic, Black, 
+11234567890
Following user logged in: null, null, null, null, true

提前感谢您的帮助。此外,我仍然是初学者,因此如果有任何突出的代码风格批评,我将不胜感激。

【问题讨论】:

    标签: android firebase firebase-realtime-database sharedpreferences event-listener


    【解决方案1】:

    注意:

    editor.putString(driver.getName(), "name");
    editor.putString(driver.getOccupants(), "occupants");
    editor.putString(driver.getPhone(), "phone");
    editor.putString(driver.getMake(), "make");
    

    应该是:

    editor.putString("name", driver.getName());
    editor.putString("occupants", driver.getOccupants());
    editor.putString("phone", driver.getPhone());
    editor.putString("make", driver.getMake());
    

    【讨论】:

      猜你喜欢
      • 2022-12-04
      • 2016-06-18
      • 2016-08-01
      • 2021-05-30
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多