SharedPreferences 代码未按预期工作

SharedPreferences code not working as intended

添加了所有必要的导入。

public class MainActivity extends AppCompatActivity {

SharedPreferences preferences;
SharedPreferences.Editor editor;
public int i;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    preferences = getSharedPreferences("MyPrefs", MODE_PRIVATE);
    editor = preferences.edit();

在第一次启动时会出现 "First time boot" 消息,但下次不应出现,而应出现保存在 sharedPreferences 中的迭代器 i。

    try{

        i = preferences.getInt("iterator", 0);

        Toast.makeText(getApplicationContext(), i, Toast.LENGTH_SHORT).show();

    }catch(Exception e){
        Toast.makeText(MainActivity.this, "First time boot", Toast.LENGTH_SHORT).show();
    }

    final TextView date = (TextView) (findViewById(R.id.textView));
    final Calendar c = Calendar.getInstance();
    date.setText(DateFormat.getDateFormat(this).format(c.getTime()));

    final Button mainBtn = (Button) findViewById(R.id.mainBtn);
    final Button exit = (Button) findViewById(R.id.exit);

    mainBtn.setText("Clock In");

    mainBtn.setOnClickListener(new View.OnClickListener(){

        public void onClick(View v){
            if(mainBtn.getText() == "Clock In"){
                mainBtn.setText("Clock Out");
            }else{mainBtn.setText("Clock In");}

            String s = new SimpleDateFormat("yyyy: MM: dd   HH: mm: ss").format(Calendar.getInstance().getTime());

我的想法是,单击按钮后,时间戳将保存到 sharedPreferences 文件中,稍后可以访问该文件。

            editor.putString("Time "+ i, s);

            i++;

            editor.putInt("iterator", i);

        }
    });

我最近才添加这个,这样当您单击退出按钮时,放入 sharedPreferences 文件中的所有内容都会被保存。 (之前的 editor.commit() 行在 mainBtn onClickListener 中)。

    exit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            editor.commit();
            finish();
        }
    });
}

问题是退出应用程序并重新启动后,应用程序不会检索存储的数据,这些数据应该保存在 sharedPreferences 文件中,而是每次都显示 "First time boot" .. 我对编程非常陌生,并尝试以多种方式解决这个问题,但最终还是遇到了同样的问题。求助!

据我所知preferences.getInt("iterator", 0);如果 "iterator" 不存在,则不会抛出异常。它将 return 一个 0。0 是默认值。我会将您的代码更改为更像:

    int iterator = preferences.getInt("iterator", -1);
    if (iterator == -1)
      Toast.makeText(this, "First time boot", Toast.LENGTH_SHORT).show();

如果您查看您的异常,我猜想问题出在您的 Toast 之后,您的 getInt("Iterator", 0) 调用传递了一个 int 而不是一个字符串。

此外,我不会在您的应用程序中让编辑器一直处于打开状态。我通常会写一个像

这样的函数
void savePreference(String key, String value) {
    SharedPreferences prefs = context.getSharedPreferences(PREFERENCES_NAME, 0);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(key, value);
    editor.commit();
}