SharedPreferences不是持久的

时间:2012-02-09 04:49:17

标签: android session sharedpreferences

我在Android中使用 SharedPreferences 。所有内容在同一会话中都很有效。

但是,一旦我重新启动应用程序,从之前的会话设置的所有首选项都将丢失。

我是否需要指定任何内容来告诉 SharedPreferences 在运行之间徘徊?

我正在通过调用

来创建首选项
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);

然后我通过例如

设置属性
preferences.edit().putString(key, value);

我通过

得到它
preferences.getString(key, defaultValue);

谢谢, 维克多

8 个答案:

答案 0 :(得分:26)

SharedPreferences持续重新启动,重启,我认为问题是你没有提交首选项,使用以下来存储首选项中的值:

Preferences.Editor edit=preferences.edit();
edit.putString(key, value);
edit.commit();

答案 1 :(得分:18)

您可能没有提交更改。设置如此属性

SharedPreferences.Editor editor = preferences.edit();
editor.putString(key, value);
editor.commit();

没有承诺,你就会在风中放屁。

答案 2 :(得分:3)

这对我有用,请尝试:

private SharedPreferences mShared;
private Editor mEdit;
mShared = PreferenceManager.getDefaultSharedPreferences(this);

mEdit = mShared.edit();
mEdit.putString(key, value);
mEdit.commit();

答案 3 :(得分:2)

获取pref中的值

SharedPreferences pref1 = getSharedPreferences(PREFS_NAME, 0);
boolean silent = pref1.getString("silentMode", "...");

保存vlue使用onstop或onPause方法

SharedPreferences pref2 = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = pref2.edit();
editor.putString("silentMode", "...");

这对我来说很好,很健康

答案 4 :(得分:1)

如果您正在开发API级别?在编程修改您的偏好时,您应该使用editor.apply()而不是editor.commit()editor.commit()已被弃用,editor.apply()将处理后台的实际持久性,而editor.commit()则不会这样做。

请注意,editor.apply()如果失败,则会默默地执行此操作。

答案 5 :(得分:1)

这是适合我的代码。

package com.example.persistence;

import android.os.Bundle;
import android.widget.EditText;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;


public class MainActivity extends Activity {

public static final String NOTE_PREFS="note";
SharedPreferences msgSettings;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
     msgSettings = getSharedPreferences(NOTE_PREFS,0);

      EditText et= (EditText)findViewById(R.id.editText1);
      if (msgSettings.contains(NOTE_PREFS)) {
            et.setText(msgSettings.getString(
                    NOTE_PREFS, "my note")); 

    }

}
@Override
protected void onPause() {
      EditText et= (EditText)findViewById(R.id.editText1);
      String b = et.getText().toString();
      Editor editor = msgSettings.edit();
      editor.putString(NOTE_PREFS,b);
        editor.commit();
    super.onPause();
}
@Override
protected void onDestroy() {
     EditText et= (EditText)findViewById(R.id.editText1);
      String b = et.getText().toString();
      Editor editor = msgSettings.edit();
      editor.putString(NOTE_PREFS,b);
        editor.commit();
    super.onDestroy();
}

    }

答案 6 :(得分:0)

在您提交首选项之前,不会保存首选项,即:

// DON'T DO THIS... See Next Example
preferences.edit().putString(key, value);
preferences.edit().commit();

编辑:上面有一个微妙的错误(来自评论);您需要保持对编辑器对象的引用,否则上面提交值的示例将创建一个新实例。应该是:

Preferences.Editor edit = preferences.edit();
edit.putString(key, value);
edit.commit();

供参考,来自Android docs

  

请注意,您必须致电commit()才能进行任何更改   编辑器实际上出现在SharedPreferences中。

答案 7 :(得分:0)

很多时间过去了,但你可以使用

.apply() 

代替

.commit()

这样会更好。 commit 尝试立即写入,但 apply 是异步的。这是谷歌文档的解释

与将其首选项同步写入持久存储的提交不同,应用会立即将其更改提交到内存中的 SharedPreferences,但会启动对磁盘的异步提交,并且您不会收到任何失败通知。如果此 SharedPreferences 上的另一个编辑器在应用程序仍未完成时执行常规提交,则提交将阻塞,直到所有异步提交以及提交本身完成。