我在存储字符串集首选项时遇到问题。我有这些用于存储的实用方法:
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。但是我有一个问题,即对于 API > 姜饼,使用 putStringSet 方法并不持久。它在应用程序运行时是持久的。但是重启后就消失了。我将描述步骤:
- 全新安装应用程序 - 键 X 没有偏好
- 我用键 X 存储字符串集 A - 首选项包含 A
- 我用键 X 存储字符串集 B - 首选项包含 B
- 关闭应用
- 重新启动应用程序 - 首选项包含 A
- 我用键 X 存储字符串集 C - 首选项包含 C
- 关闭应用
- 重新启动应用程序 - 首选项包含 A
所以只有第一个值是持久的,我不能覆盖它。
其他注意事项:
- 这个方法只是替换了 putStringSet 和 getStringSet。所以我使用 commit()...但在其他地方(见下面的例子)。
- 我试图用 apply() 替换 commit() - 没有成功
- 当我在较新的 API 中使用旧 API 的代码时(我在两种方法中都注释了前 4 行),它可以完美运行,但效率不高
使用示例:
Editor e = mPref.edit();
PreferencesUtils.putStringSet(mPref, e, GlobalPreferences.INCLUDED_DIRECTORIES, dirs);
e.commit();
非常感谢您的帮助。