首页 > 解决方案 > 如何修复“数据未保存”?

问题描述

我正在制作一个新的问答游戏。我正在尝试用分数解决保存数据的问题。当我打开活动时,分数是可见的,但是当我第二次打开同一个活动时,我失去了分数并且所有数据都返回到 0。我该如何解决它?

我使用 SharedPreferences 来保存数据,因为我不使用数据库服务器。

私人无效Punteggio(){

    // TODO: initialization 

    final int score = getIntent ( ).getIntExtra ( Home.DATA_Score , 0 );
    last_score = score;
    last_score_Label.setText ( "Ultimo punteggio: " + last_score );


    // TODO: Miglior punteggio e ultimo punteggio
    SharedPreferences settings = getSharedPreferences ( "GAME_DATA" , MODE_PRIVATE );
    highscore = settings.getInt ( "HIGHSCORE" , 0 );


    // TODO: Saving highscore
    // Last score isn't saved but highscore is saved
    if ( score > highscore ) {
        highscore_Label.setText ( "Miglior punteggio: " + score );

        // Salvataggio
        SharedPreferences.Editor editor = settings.edit ( );
        editor.putInt ( "HIGHSCORE" , score );
        editor.putInt ( "LAST_SCORE", last_score );
        editor.apply ( );
    } else {
        highscore_Label.setText ( "Miglior punteggio: " + highscore );
    }

}

// 我想保存 graphicsAvatar 和 formLabel 但它们没有保存

private void showGrafico(){

    final int number = getIntent ().getIntExtra ( Home.DATA_Avatar, 0 );
    number_avatar = number;
    switch (number){
        case 1: graphicAvatar.setImageResource ( R.drawable.negative );
            formaLabel.setText ( "Stato di forma: Pessimo" );
            break;
        case 2: graphicAvatar.setImageResource ( R.drawable.normal );
            formaLabel.setText ( "Stato di forma: Normale" );
            break;
        case 3: graphicAvatar.setImageResource ( R.drawable.positive );
            formaLabel.setText ( "Staot di forma: Ottimo" );
            break;
    }


}

// 我希望数据被保存,但它不像我预期的那样......

// 我修改了代码,是这样的,但问题仍然存在:private void showGrafico(){

    final int number = getIntent ().getIntExtra ( Home.DATA_Avatar, 0 );
    switch (number){
        case 1: graphicAvatar.setImageResource ( R.drawable.negative );
            formaLabel.setText ( "Stato di forma: Pessimo" );
            break;
        case 2: graphicAvatar.setImageResource ( R.drawable.normal );
            formaLabel.setText ( "Stato di forma: Normale" );
            break;
        case 3: graphicAvatar.setImageResource ( R.drawable.positive );
            formaLabel.setText ( "Staot di forma: Ottimo" );
            break;
    }

    // TODO: Miglior punteggio e ultimo punteggio

    SharedPreferences pref = getApplicationContext().getSharedPreferences("DATA_AVATAR", MODE_PRIVATE);
    number_avatar = pref.getInt ( "NUMBER" , 0 );

    SharedPreferences.Editor editor = pref.edit ( );
    editor.putInt ( "NUMBER" , number_avatar );
    editor.commit ();


}

// 然后还有: private void showPunteggio ( ) {

    // TODO: inizializzazione variabili

    final int score = getIntent ( ).getIntExtra ( Home.DATA_Score , 0 );
    last_score = score;
    last_score_Label.setText ( "Ultimo punteggio: " + last_score );




    // TODO: Miglior punteggio e ultimo punteggio
    SharedPreferences settings = getApplicationContext().getSharedPreferences("GAME_DATA",0);
    highscore = settings.getInt ( "HIGHSCORE" , 0 );


    // TODO: Salvataggio Miglior Punteggio
    if ( score > highscore ) {
        highscore_Label.setText ( "Miglior punteggio: " + score );

        // Salvataggio
        SharedPreferences.Editor editor = settings.edit ( );
        editor.putInt ( "HIGHSCORE" , score );
        editor.commit ( );
    } else {
        highscore_Label.setText ( "Miglior punteggio: " + highscore );
    }

}

标签: java

解决方案


Instead of apply() can you try calling commit()?

editor.commit();

Please note that commit() is a blocking call and should be avoided in UI thread. In case commit() does not work let me know.

By the way, how you are getting SharedPreferences object is not clear. It should be:

SharedPreferences pref = getApplicationContext().getSharedPreferences("XYZ", MODE_PRIVATE); 

推荐阅读