Android. Неправильная практика состоит в том, чтобы иметь несколько общих настроек?

У меня есть приложение, использующее SharedPreferences. Один просто хранит версию приложения для проверки обновления для журнала изменений, а другой содержит некоторую информацию о макете, которую clear() получает, когда пользователь выбирает. Мне наконец-то удалось заставить работать PreferenceFragment и заметить тенденцию, поэтому я подумал, что могу попросить об этом сейчас, прежде чем я предпочел бы сумасшедший (хотя я думаю, что у меня достаточно).

Я сделал все возможное, чтобы искать и не видеть конкретного упоминания о проблеме, только чтобы можно было иметь кратность.

Я немного обеспокоен тем, что PreferenceManager.getDefaultSharedPreferences() схватил неправильный префикс, но я мог бы просто не понимать использование.

Единственный соответствующий код, о котором я мог думать в своей деятельности:

SharedPreferences storedVer = getSharedPreferences(VER_NUM, 0);
SharedPreferences savedLayout = getSharedPreferences(LAYOUT_SAVE, 0);

Ответы

Ответ 1

Это совсем не плохая практика. Я думаю, что все наоборот. Я думаю, что разные типы поведения должны использовать разные файлы sharedPreference.

.getDefaultSharedPreferences() использует файл com.company.packagename.xml по умолчанию. И другие создают свои собственные файлы.

В моем представлении появляются следующие преимущества использования нескольких sharedPreference's.

  • Когда вы используете BackupManager, вы можете предоставить файлы sharedPreference для резервного копирования и восстановления.
  • Когда пользователь выходит из системы, вы можете удалить файл sharedPreference с этими личными значениями пользователей в нем. Возможно, вам не захочется удалять другие.

Ответ 2

Из моего опыта работы с SharedPreferences я заметил следующее:

1) Всегда используйте попытку сделать имя SharedPreference и имя атрибутов уникальными на всем устройстве.

2) Не используйте имя вашего SharedPreference как "myPreference", "preference", "appPreference"... и т.д. Используйте PackageName как уникальный идентификатор для имени SharedPreference.

Пример:

SharedPreferences preferences = getSharedPreferences(Context.getPackageName(), Context.MODE_PRIVATE);   

3) Используйте также уникальные ключи для ваших атрибутов, объединив имя атрибута с именем пакета.

Пример:

Editor editor = sharedpreferences.edit();
boolean isAdminKey = Context.getPackageName()+"admin";
editor.putString(isAdminKey , "value");
editor.commit();

4) Нет проблем с редактированием нескольких значений клавиш одним commit().

5) Используйте MODE_PRIVATE при создании своих настроек, чтобы другие приложения не читали ваш SharedPreferences. См., Например, пример 2.

6) Не полагайтесь на SharedPreferences 100%, потому что он будет очищен, если пользователь нажал кнопку Clear Data на экране информации о приложении. В противном случае создайте файл в ExternalDirectory() или отправьте свою информацию на сервер.

Ответ 3

Поздно к партии, но я бы сказал, не используйте несколько предпочтений. Прикрепите getDefaultSharedPreferences. Я видел, что многие не отслеживают имена сохраненных настроек. В общем, это делает код более сложным не в том смысле (компилятор не может помочь вам управлять своими именами). Кроме того, общие настройки предназначены для нескольких небольших значений - используйте файловую систему для больших вещей и базу данных для большого количества данных.

Я видел, что названные общие предпочтения используются много, и я считаю, что это неудачный тренд, распространяемый copyPaste().

Наконец, ваши действия с предпочтениями записываются в общие настройки по умолчанию - я недавно ответил на вопрос, где это была проблема, - было бы полностью исключено, если бы использовались предпочтения по умолчанию. Смотрите: Android SharedPreferences не меняется

Вы можете рассмотреть возможность использования методов общих настроек по умолчанию, чтобы сделать их еще менее подробными, как я сделал здесь