Android: Preferencje zestawu znaków nie są trwałe
Mam problem z przechowywaniem preferencji zestawu łańcuchów. Mam te narzędzia do przechowywania:
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;
}
}
}
Używam tych metod, aby być kompatybilnymi wstecz z GB. Ale mam problem, że użycie metody putStringSet nie jest trwałe dla API> piernika. Jest trwały, gdy aplikacja działa. Ale znika po restarcie. Opiszę kroki:
Czysta instalacja aplikacji - nie ma preferencji z kluczem XPrzechowuję zestaw łańcuchów A z kluczem X - preferencja zawiera APrzechowuję zestaw łańcuchów B z kluczem X - preferencja zawiera BZamknij aplikacjęPonowne uruchomienie preferencji aplikacji zawiera APrzechowuję zestaw łańcuchów C z kluczem X - preferencja zawiera CZamknij aplikacjęPonowne uruchomienie preferencji aplikacji zawiera AWięc tylko pierwsza wartość jest trwała i nie mogę jej zastąpić.
Inne notatki:
ta metoda zastępuje putStringSet i getStringSet. Używam więc commit () ... ale gdzie indziej (patrz przykład poniżej).Próbowałem zastąpić commit () poleceniem apply () - bez powodzeniaKiedy używam kodu dla starszych API w nowszych API (skomentowałem pierwsze 4 wiersze w obu metodach), działa to bez zarzutu, ale nie jest tak wydajnePrzykład użycia:
Editor e = mPref.edit();
PreferencesUtils.putStringSet(mPref, e, GlobalPreferences.INCLUDED_DIRECTORIES, dirs);
e.commit();
Wuj cię bardzo za pomoc.