2014-02-18 4 views
14

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

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

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

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

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

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

+0

А, спасибо за подтверждение. Должен ли я беспокоиться о том, что возвращает '.getDefaultSharedPreferences()'? – ziondreamt

ответ

6

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

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

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

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

Спасибо за объяснение '.getDefaultSharedPreferences()', я немного смутил то, что происходило, когда это было вызвано. – ziondreamt

2

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

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

2) Не используйте название вашей SharedPreference как "myPreference", "предпочтение", "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 в информационном экране App. В противном случае создайте файл в ExternalDirectory() или отправьте информацию на сервер.

+2

Я думаю, что создание файлов во внешнем каталоге напрямую - плохая практика. Когда вы это делаете, вы массируете файловую систему пользователей и SD-карту. У меня есть десятки папок из разных приложений. Я использую предоставленное место во внешней файловой системе. И он также удаляется, когда пользователь выбирает четкие данные. – tasomaniac

+2

Кроме того, когда пользователь хочет очистить данные, данные должны быть очищены. Нет смысла останавливать его. – tasomaniac

+0

Я не предпочитаю этого, но многие известные приложения делают это как 'watsapp' и' viber'. Таким образом, вы сможете хранить свои данные от любых действий «Очистить данные» и «Деинсталлировать» :) @tasomaniac –

0

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

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

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

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

+0

Интересная точка, @Mr_and_Mrs_D. Я могу видеть, что минимизация моего количества общих префов будет иметь смысл и только добавит больше, если я им действительно понадоблюсь, но, как я уже сказал, одна из префов получает вызов 'clear()' так часто, как пользователь выбирает, и я не делаю еще есть знания о лучшем способе сделать это. Поэтому, если я использую этот префикс для всего, что я считаю, он часто терял бы его содержимое. Я рассмотрел параметры файловой системы и базы данных, но я думаю, что это немного выходит за рамки моего приложения (по крайней мере, на данный момент). – ziondreamt

+1

@ziondreamt: рассмотрите [editor.remove («ключ»)] (http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#remove (java.lang.String)) –

Смежные вопросы