我在存储字符串集偏好时遇到了问题。我有这些实用的方法来存储:Android:字符串集偏好不是持久的
public static void putStringSet(SharedPreferences pref, Editor e, String key, Set<String> set)
{
if (Utils.isApiLevelGreaterThanGingerbread())
{
// e.remove(key); // I tried to remove it here
e.putStringSet(key, set);
}
else
{
// removes old occurences of key
for (String k : pref.getAll().keySet())
{
if (k.startsWith(key))
{
e.remove(k);
}
}
int i = 0;
for (String value : set)
{
e.putString(key + i++, value);
}
}
}
public static Set<String> getStringSet(SharedPreferences pref, String key, Set<String> defaultValue)
{
if (Utils.isApiLevelGreaterThanGingerbread())
{
return pref.getStringSet(key, defaultValue);
}
else
{
Set<String> set = new HashSet<String>();
int i = 0;
Set<String> keySet = pref.getAll().keySet();
while (keySet.contains(key + i))
{
set.add(pref.getString(key + i, ""));
i++;
}
if (set.isEmpty())
{
return defaultValue;
}
else
{
return set;
}
}
}
我使用这些方法向后兼容GB。但我有一个问题,即使用putStringSet方法对于API>姜饼不是持久的。它在应用程序运行时保持不变。但重启后消失。我将介绍的步骤:
- 干净安装应用程序的 - 没有与主要X没有偏好
- 我存储的字符串集合A与关键X - 偏好包含
- 我存储串集B与键X - 优选含有B
- 关闭应用
- 应用的重启 - 偏好包含
- 我串集合C存储与密钥X - 优选含有C
- 氯OSE应用
- 应用程序的重新启动 - 偏好包含
所以只有第一个值是持久的,我不能覆盖它。
其他说明:
- 这种方法只是取代putStringSet和getStringSet。所以我使用commit()...但在其他地方(见下面的例子)。
- 我试图用apply()取代commit() - 没有成功
- 当我在较新的API中使用旧代码的代码(我在两个方法中评论了前四行)时,它的工作原理完美无缺,但效率不高使用
例子:
Editor e = mPref.edit();
PreferencesUtils.putStringSet(mPref, e, GlobalPreferences.INCLUDED_DIRECTORIES, dirs);
e.commit();
Thnak你非常的帮助。
您如何初始化dirs? –
[尝试存储使用SharedPreferences的字符串集时出现错误行为]的可能重复(http://stackoverflow.com/questions/14034803/misbehavior-when-trying-to-store-a-string-set-using-sharedpreferences) –