从共享偏好设置中存取字符串数组

62
我需要将一些字符串数组保存在共享首选项中,然后再获取它们。 我尝试了以下代码:prefsEditor.putString(PLAYLISTS, playlists.toString());其中playlists是一个String[], 要获取它们,我使用了以下代码:playlist= myPrefs.getString(PLAYLISTS, "playlists");其中playlist是一个String,但是并没有成功。 请问我该怎么做呢?
5个回答

106

您可以像这样创建自己的数组字符串表示:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < playlists.length; i++) {
    sb.append(playlists[i]).append(",");
}
prefsEditor.putString(PLAYLISTS, sb.toString());

当您从SharedPreferences中获取字符串时,只需像这样解析它:

String[] playlists = playlist.split(",");

这应该可以完成工作。


4
问题在于字符串中不能包含用来分隔它们的字符。在使用该方法之前需要进行编码。 - Mario Lenci
5
@Mario Lenci,我使用“;;delimiter;;”作为分隔字符串。 - dimetil
@dimetil 这看起来很丑。而且如果有人输入“;;delimiter;;”,你就会遇到问题。(更不用说浪费内存和 CPU 来解析这个东西了) - Paweł Brewczynski
1
那么,你的解决方案是什么,bluesm? - Greg Ennis
保存部分可以简化为: prefsEditor.putString(PLAYLISTS, TextUtils.join(",", playlists)); - rbs
显示剩余2条评论

38

从 API 级别 11 开始,您可以使用 putStringSet 和 getStringSet 存储/检索字符串集合:

SharedPreferences pref = context.getSharedPreferences(TAG, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
editor.putStringSet(SOME_KEY, someStringSet);
editor.commit();

SharedPreferences pref = context.getSharedPreferences(TAG, Context.MODE_PRIVATE);
Set<String> someStringSet = pref.getStringSet(SOME_KEY);

我认为如果有人从API级别11或更高级别构建应用程序,那么这比接受的答案更容易。 - Sayem
16
问题在于Set没有顺序。与String[]相比不同。 - Tomáš Hubálek
我有一个字符串数组,其值为 <item>a,0</item> <item>b,1</item> 现在在设置中点击后,我想更改这些值。如何使用putStringSet实现此操作。 - pa1pal
@pa1pal,你应该创建一个新的问题,并在那里解释清楚你想做什么以及你目前已经做了什么。 - MikeL

9

4
HashSet<String> mSet = new HashSet<>();
                mSet.add("data1");
                mSet.add("data2");
saveStringSet(context, mSet);

where

public static void saveStringSet(Context context, HashSet<String> mSet) {
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = sp.edit();
    editor.putStringSet(PREF_STRING_SET_KEY, mSet);
    editor.apply();
}

并且

public static Set<String> getSavedStringSets(Context context) {
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
    return sp.getStringSet(PREF_STRING_SET_KEY, null);
}

private static final String PREF_STRING_SET_KEY = "string_set_key";

4
正如 @Tomáš Hubálek 所指出的,Set 是无序的,所以可能会改变程序的行为。 - Dale

0

使用这个简单的函数将数组列表存储在偏好设置中,如果您想要更多信息点击这里

 public static void storeSerializeArraylist(SharedPreferences sharedPreferences, String key, ArrayList tempAppArraylist){
    SharedPreferences.Editor editor = sharedPreferences.edit();
    try {
        editor.putString(key, ObjectSerializer.serialize(tempAppArraylist));
        editor.apply();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

如何从偏好设置中获取存储的数组列表

public static ArrayList getSerializeArraylist(SharedPreferences sharedPreferences, String key){
    ArrayList tempArrayList = new ArrayList();
    try {
        tempArrayList = (ArrayList) ObjectSerializer.deserialize(sharedPreferences.getString(key, ObjectSerializer.serialize(new ArrayList())));
    } catch (IOException e) {
        e.printStackTrace();
    }
    return tempArrayList;
}

这个链接已经失效了。ObjectSerializer不是Android中的一个类。 - Eugene Kartoyev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接