SharedPreferences не сохраняет логический атрибут - PullRequest
0 голосов
/ 19 апреля 2020

У меня проблема с сохранением логического объекта в SharedPreferences. Объект (часть «вопросов» ArrayList) содержит логическое значение « RecentAnswer ». Если я изменю логическое значение и захочу использовать его в другом действии, это значение будет все еще старым .

Вот мой метод saveData из действия 1:

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();
    }

Во-первых, я загружаю ArrayList в занятии 2:

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 Ответ

0 голосов
/ 19 апреля 2020

Не делай этого:

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 и оставьте вопросы там, а затем отсылайте их оттуда.

Вам нужно go Вернемся немного назад и посмотрим, как разрабатывать программы на Java, Kotlin или на любом другом языке. Это то, что приходит после того, как вы изучите основы программирования.

...