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 не меняется
Вы можете рассмотреть возможность использования методов общих настроек по умолчанию, чтобы сделать их еще менее подробными, как я сделал здесь