Установить <String> в android sharedpreferences не сохраняет силу
Я пытаюсь использовать androids sharedpreferences, я зарегистрировал все, а код ниже действительно выполняет набор строк. Проблема в том, что когда я принудительно закрываю приложение и начинаю заново, settings.getStringSet возвращает пустой набор. Нет ошибок в работе.
Я пробовал PreferenceManager.getDefaultSharedPreferences, но это тоже не работает для меня.
Спасибо за ваше время.
public static final String PREFS_NAME = "MyPrefsFile";
private static final String FOLLOWED_ROUTES = "followedRoutes";
и позже, когда вызывается сохранение:
public void onFollowClicked(View view){
SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
Set<String> follows = settings.getStringSet(FOLLOWED_ROUTES, new HashSet<String>());
follows.add(routeId);
editor.putStringSet(FOLLOWED_ROUTES, follows);
editor.commit();
}
Ответы
Ответ 1
Посмотрите здесь.
Также для повторения:
SharedPreferences
SharedPreferences.Editor
EDIT:
На самом деле есть ошибка с этим, см. здесь. Выдержка оттуда:
Эта проблема все еще присутствует на уровне API API.
Это вызвано тем, что метод getStringSet() Класс SharedPreferences не возвращает копию объекта Set: it возвращает весь объект, и когда вы добавляете к нему новые элементы, Метод commitToMemory класса SharedPrefencesImpl.EditorImpl см. что существующее значение равно предыдущему сохраненному.
Способы решения этой проблемы - сделать копию набора возвращается SharedPreferences.getStringSet или принудительно записывается в памяти, используя другие предпочтения, которые всегда меняются (например, свойство, которое каждый раз хранит размер набора)
EDIT2:
Здесь может быть решение , посмотрите.
Ответ 2
Вы также можете обойти ошибку, указанную g00dy следующим образом:
Получить набор из sharedPreferences и сохранить его в переменной.
Затем просто удалите набор в sharedpreferences, прежде чем добавлять его при сохранении.
SharedPreferences.Editor editor= sharedPref.edit();
editor.remove("mSet");
editor.apply();
editor.putStringSet("mSet", mSet);
editor.apply();
Обязательно используйте apply() или commit() дважды.