Android: a preferência do conjunto de sequências não é persistente
Eu tenho um problema com o armazenamento de preferência de conjunto de seqüências de caracteres. Eu tenho esses métodos de utilitário para armazenar:
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;
}
}
}
Eu uso esses métodos para ser compatível com GB. Mas eu tenho um problema que usar o método putStringSet não é persistente para API> gingerbread. É persistente enquanto o aplicativo está em execução. Mas desaparece após o reinício. Eu descreverei as etapas:
Instalação limpa do aplicativo - não há preferência com a tecla XEu guardo o conjunto de caracteres A com a tecla X - a preferência contém AEu guardo o conjunto de cordas B com a tecla X - a preferência contém BFeche o aplicativoReinício do aplicativo - a preferência contém AEu guardo o conjunto de caracteres C com a tecla X - a preferência contém CFeche o aplicativoReinício do aplicativo - a preferência contém APortanto, apenas o primeiro valor é persistente e não posso sobrescrevê-lo.
Outras notas:
este método apenas substitui putStringSet e getStringSet. Então eu uso commit () ... mas em outro lugar (veja o exemplo abaixo).Eu tentei substituir commit () com apply () - sem sucessoQuando eu uso código para APIs mais antigas em APIs mais novas (comentei as primeiras 4 linhas em ambos os métodos), ele funciona perfeitamente, mas não é tão eficienteExemplo de uso:
Editor e = mPref.edit();
PreferencesUtils.putStringSet(mPref, e, GlobalPreferences.INCLUDED_DIRECTORIES, dirs);
e.commit();
Thkak muito por ajuda.