SharedPreferences 不保存布尔属性

Posted

技术标签:

【中文标题】SharedPreferences 不保存布尔属性【英文标题】:SharedPreferences not saving boolean attribute 【发布时间】:2020-08-02 00:57:38 【问题描述】:

我在 SharedPreferences 中保存布尔对象时遇到问题。该对象(ArrayList“问题”的一部分)包含一个布尔值“recentAnswer”。 如果我更改布尔值并想在另一个活动中使用它,则该值仍然是旧的

这是我在活动 1 中的 saveData 方法:

private void saveData()
        SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        Gson gson = new Gson();
        String json = gson.toJson(questions);
        editor.putString("task list", json);
        editor.apply();
    

我在这里使用它来保存更改后的布尔值(活动 1):

private void checkAnswer(Button answerButton)
        if (answerButton.getText().equals(questions.get(currentQuestion).getAnswer1()))
            questions.get(currentQuestion).recentAnswer = true;
        
        else
            questions.get(currentQuestion).recentAnswer = false;
        
        Toast.makeText(this, Boolean.toString(questions.get(currentQuestion).recentAnswer), Toast.LENGTH_SHORT).show();
        saveData();
    

首先,我在 Activity 2 中加载 ArrayList:

private void loadData()
        SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
        Gson gson = new Gson();
        String json = sharedPreferences.getString("task list", null);
        Type type = new TypeToken<ArrayList<Question>>().getType();
        questions = gson.fromJson(json, type);

        if(questions == null)
            questions = new ArrayList<>();
        
    

然后我想获取“recentAnswer”值(活动 2):

@Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_statistics);

        loadData();
        for (Question element : questions)
            int recentWrong;
            if (!element.recentAnswer)
                recentWrong++;
            
        
        Toast.makeText(this, Integer.toString(recentWrong), Toast.LENGTH_SHORT).show();
    

不管我如何更改活动 1 中的值,在活动 2 中“recentWrong”始终 = 0,即使我正在访问问题。

【问题讨论】:

【参考方案1】:

不要这样做:

SharedPreferences.Editor editor = sharedPreferences.edit();
        Gson gson = new Gson();
        String json = gson.toJson(questions);
        editor.putString("task list", json);

永远不要这样做。首先是你没有检查并且不知道价值问题可能包含什么,你也不应该在 SharedPrefs 中保存类似的东西。

如果您有多个问题,则将每个问题连同其响应一起保存在 SharedPrefs 中,并且如果您需要保存一个您希望稍后在代码中检查的答案,请使用存储在 res->strings.xml 中的字符串值。 如果问题太长,想办法连接它或使用 res->string-arrays.xml 并将问题保留在那里,然后从那里引用它们。

您需要回过头来看看如何用 Java、Kotlin 或任何语言设计程序。这是您学习了编程基础知识之后的内容。

【讨论】:

以上是关于SharedPreferences 不保存布尔属性的主要内容,如果未能解决你的问题,请参考以下文章

如何从复选框数组中保存布尔状态并在使用 SharedPreferences 加载适配器时加载它们的状态

保存和加载布尔状态

SharedPreferences 未保存在 onPause 方法中

Android数据存储SharedPreferences

SharedPreferences使用及原理

如何使用SharedPreferences? [重复]