42

正如标题所说,我想保存和检索某些字符串。但是我的代码在检索或存储中都不会通过第一行。我试图按照这个链接:http: //developer.android.com/guide/topics/data/data-storage.html

private void savepath(String pathtilsave, int i) {
    String tal = null;
    // doesn't go past the line below
    SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();
    tal = String.valueOf(i);
    editor.putString(tal, pathtilsave);
    editor.commit();
}

和我的检索方法:

public void getpaths() {
    String tal = null;
    // doesn't go past the line below
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    for (int i = 1; i <= lydliste.length - 1; i++) {
        tal = String.valueOf(i);
        String restoredText = settings.getString(tal, null);
        if (restoredText != null) {
            lydliste[i] = restoredText;
        }
    }
}

lydliste 是一个静态字符串数组。PREFS_NAME

public static final String PREFS_NAME = "MyPrefsFile";
4

7 回答 7

89

要保存到首选项:

PreferenceManager.getDefaultSharedPreferences(context).edit().putString("MYLABEL", "myStringToSave").apply();  

要获取存储的首选项:

PreferenceManager.getDefaultSharedPreferences(context).getString("MYLABEL", "defaultStringIfNothingFound"); 

context你的上下文在哪里。


如果您获得多个值,重用同一个实例可能更有效。

 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
 String myStrValue = prefs.getString("MYSTRLABEL", "defaultStringIfNothingFound");
 Boolean myBoolValue = prefs.getBoolean("MYBOOLLABEL", false);
 int myIntValue = prefs.getInt("MYINTLABEL", 1);

如果您要保存多个值:

Editor prefEditor = PreferenceManager.getDefaultSharedPreferences(context).edit();
prefEditor.putString("MYSTRLABEL", "myStringToSave");
prefEditor.putBoolean("MYBOOLLABEL", true);
prefEditor.putInt("MYINTLABEL", 99);
prefEditor.apply();  

注意:保存apply()优于使用commit(). 您唯一需要的时候commit()是如果您需要返回值,这是非常罕见的。

于 2012-08-22T13:25:51.277 回答
10
private static final String PREFS_NAME = "preferenceName";

public static boolean setPreference(Context context, String key, String value) {
    SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString(key, value);
    return editor.commit();
}

public static String getPreference(Context context, String key) {
    SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
    return settings.getString(key, "defaultValue");
}
于 2012-08-22T13:27:33.217 回答
5

我解决了!当我从类中调用方法时它不起作用!由于某种原因,我不得不从另一个类中调用它,并将“classname.this”写为 Context 参数。这是最后的工作:

SharedPreferences settings = ctx.getSharedPreferences(PREFS_NAME, 0);
    settings = ctx.getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString(tal, pathtilsave);
     editor.commit(); 
于 2012-08-22T23:01:41.493 回答
4

使用 SharedPreferences 保存字符串的简单步骤:

public class MainActivity extends AppCompatActivity {


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

    SharedPreferences prefs = this.getSharedPreferences("com.example.nec.myapplication", Context.MODE_PRIVATE);

    prefs.edit().putString("userName", "NEC").apply();

    String name = prefs.getString("userName", "");

    Log.i("saved string", name);
}
于 2018-05-29T18:07:19.090 回答
3

在上下文中尝试:

final SharedPreferences settings = context.getSharedPreferences(
            PREFS_NAME, 0);

return settings.getString(key, null);
于 2012-08-22T13:25:50.457 回答
3

如果您不关心 commit() 的返回值,最好使用 apply(),因为它是异步的,比 commit() 更快

final SharedPreferences prefs =  context.getSharedPreferences("PREFERENCE_NAME",
                Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("key", "value");
editor.apply();

根据文档

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

于 2015-10-28T18:41:46.993 回答
0

SharedPreferences 类允许您保存特定于 android 应用程序的首选项。

API 版本 11 引入了 putStringSet 和 getStringSet 方法,它们允许开发人员分别存储字符串值列表和检索字符串值列表。

使用 SharedPreferences 存储字符串数组的示例可以这样完成:

// Get the current list.

SharedPreferences settings = this.getSharedPreferences("YourActivityPreferences", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
Set<String> myStrings = settings.getStringSet("myStrings", new HashSet<String>());

// Add the new value.

myStrings.add("Another string");


// Save the list.
 editor.putStringSet("myStrings", myStrings); editor.commit();
于 2014-05-09T09:08:17.207 回答