我在存儲字符串集偏好時遇到了問題。我有這些實用的方法來存儲: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) –