2014-01-24 3 views
0

Мне удалось получить мой счет, чтобы сохранить его в SharedPreferences правильно, а также сохранить его в рекорд. Однако, проверяя, что предыдущий результат лучше, чем сохраненный рекордер, он всегда сохраняет его, несмотря ни на что, и я не знаю почему.Перезапись предыдущего рекорда с использованием sharedpreferences

// save score and time if current score is > than current highscore and time is > than current hightime 
     if (score > scorePreferences.getInt("highscore", 0) && time > timePreferences.getInt("hightime", 0)) { 
      highscorePreferences = getContext().getSharedPreferences("highscore", 0); 
      SharedPreferences.Editor editorHighscore = highscorePreferences.edit(); 
      editorHighscore.putInt("highscore", score); 
      editorHighscore.commit(); 

      timePreferences = getContext().getSharedPreferences("hightime", 0); 
      SharedPreferences.Editor editorHightime = timePreferences.edit(); 
      editorHightime.putInt("hightime", time); 
      editorHightime.commit(); 
     } 

Затем он получает читать gameoveractivity и деятельности с использованием рекордов этот код:

// load score from last session 
    private void load() { 
     // get score and set text field 
     scorePreferences = getSharedPreferences("score", 0);   
     score = scorePreferences.getInt("score", 0); 
     scoreValue.setText(Integer.toString(score)); 

     // get time and set text field 
     timePreferences = getSharedPreferences("time", 0); 
     time = timePreferences.getInt("time", 0); 
     timeValue.setText(Integer.toString(time) + " seconds"); 

     // get highscore and set text field 
     highscorePreferences = getSharedPreferences("highscore", 0); 
     highscore = highscorePreferences.getInt("highscore", 0); 
     highscoreValue.setText(Integer.toString(highscore)); 
    } 
+1

Разбивайте свою первую линию, как так что вы можете узнать, почему: 'int currentHighScore = scorePreferences.getInt (" highscore ", 0); int currentHighTime = timePreferences.getInt ("hightime", 0); Log.i ("score", currentHighScore + "" + currentHighTime); if (score> currentHighScore && time> currentHighTime) {' – Tenfour04

+0

Лучше ли лучше? – Broak

+0

Кстати, вам не нужны отдельные файлы SharedPreferences для каждого типа записей. Вот почему записи имеют ключи. SharedPreferences очень похож на HashMap. Кроме того, поскольку вы используете переменную-член для каждого из ваших экземпляров общих настроек, вам не нужно продолжать вызов getSharedPreference после того, как вы впервые это сделаете в 'onCreate'. – Tenfour04

ответ

2

Если это:

if (score > scorePreferences.getInt("highscore", 0)... 

... не может быть что-то вроде:

if (score > highscorePreferences.getInt("highscore", 0)... 

Ключа "рекорды" в ваших предпочтениях, установленных с тем же именем. Похоже, вы читаете этот ключ из настроек «score». Его там нет, поэтому используется значение по умолчанию 0.

+0

Да! Буквально это осознало сейчас. Также необходимо было перемещать контекст получения за пределы if или else, указав нулевой указатель. –

2

Похоже, что вы используете тот же ключ для sharedpreferences именно поэтому значения коррекции. Я бы рекомендовал использовать sqlite для хранения лучших результатов.

2

Используйте один объект SharedPreferences. Для сохранения, вы можете сделать это:

SharedPreferences prefs = getSharedPreferences("score", Context.MODE_PRIVATE); 

int highscore = prefs.getInt("highscore", 0); 
int hightime = prefs.getInt("hightime", 0); 

if (score > highscore && time > hightime) { 
    SharedPreferences.Editor editor = prefs.editor(); 

    editor.putInt("highscore", score); 
    editor.putInt("hightime", time); 
    editor.commit(); 
} 

Затем загрузите его, а также использовать один SharedPreferences объект:

private void load() { 
    SharedPreferences prefs = getSharedPreferences("score", Context.MODE_PRIVATE); 

    score = prefs.getInt("score", 0); 
    scoreValue.setText(Integer.toString(score)); 

    time = prefs.getInt("time", 0); 
    timeValue.setText(Integer.toString(time) + " seconds"); 

    highscore = prefs.getInt("highscore", 0); 
    highscoreValue.setText(Integer.toString(highscore)); 
}  

ПРИМЕЧАНИЯ:

  • это хорошая идея использовать ключи для префов имя файла и переменные, так что вы можете избежать ошибок при печати или извлечении переменных, например.

    public static final String PREFS_NAME = "score"; 
    public static final String KEY_HIGHSCORE = "highscore"; 
    public static final String KEY_HIGHTIME = "hightime"; 
    

затем использовать его

SharedPreferences prefs = getSharedPreferences(ClassNameWhereItsDeclared.PREFS_NAME, Context.MODE_PRIVATE); 

editor.putInt(ClassNameWhereItsDeclared.KEY_HIGHSCORE, score); 

т.д.

  • Я не вижу, где вы экономите время и счет, но вы можете сделать это таким же образом, как рекорды и высокоскоростные игры
Смежные вопросы