2014-01-24 74 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(「分數」,currentHighScore +「」+ currentHighTime);如果(分數> currentHighScore && time> currentHighTime){' – Tenfour04

+0

更好的時間更好? – Broak

+0

順便說一句,您不需要爲每種類型的條目分開SharedPreferences文件。這就是爲什麼這些條目有鍵。 SharedPreferences很像一個HashMap。此外,由於您正在爲每個共享首選項的實例使用成員變量,因此您不必在第一次在'onCreate'中執行操作後繼續調用getSharedPreference。 – Tenfour04

回答

2

應該這樣:

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

...不一樣的東西:

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

關鍵的 「排行榜」 是在你的喜好與相同名稱的設置。看起來您正在從「分數」首選項中讀取該密鑰。它不在那裏,所以總是使用默認值0。

+0

是的!從字面上看,現在才意識到這一點。還必須將獲取的上下文移動到if之外或者獲得空指針。 –

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

  • 我沒有看到你節省時間和得分,但你可以做同樣的方式作爲高分和高時間