Удалить именованный файл настроек в Android

Я могу создать новый файл настроек, вызвав Context.getSharedPreferences(имя строки, режим int), помещая некоторые значения в редактор возвращенных настроек и фиксируя. Однако я не вижу в API интерфейса для удаления созданного файла, когда он мне больше не нужен. Я пробовал Context.deleteFile(String name), передавая тот же аргумент name, что и выше, но возвращает false, указывая, что файл на самом деле не был удален. Я использую MODE_PRIVATE, если это имеет значение.

Просмотр источника для контекстная реализация редактора также не дает никаких подсказок.

Есть идеи? Предыстория здесь заключается в том, что я разрешаю своим пользователям сохранять копии своих «текущих» настроек, чтобы они могли восстановить ранее сохраненные настройки. Когда им больше не нужны эти настройки, я хочу удалить сохраненный файл настроек, чтобы он не занимал места. На данный момент лучшее, что я могу сделать, это edit().clear().commit в файле, который, как я полагаю, удалит большую часть содержимого. Однако не так хорошо, как удалить.


person Josh    schedule 05.11.2010    source источник


Ответы (1)


Я пробовал Context.deleteFile(String name), передавая аргумент с тем же именем сверху, но это возвращает false, указывая, что файл на самом деле не был удален.

Это потому, что файл находится не в этом каталоге.

Предыстория здесь заключается в том, что я разрешаю своим пользователям сохранять копии своих «текущих» настроек, чтобы они могли восстановить ранее сохраненные настройки.

Как вы делаете копию?

С точки зрения поддерживаемых API-интерфейсов лучше всего сделать реальные SharedPreferences текущими активными настройками, а также делать резервные копии и восстанавливать файлы в своем собственном формате в своем собственном каталоге.

Если вы не склонны идти в этом направлении, файл будет XML-файлом в каталоге ../shared_prefs относительно getFilesDir(), поэтому вы можете создать соответствующий объект File и удалить его таким образом. Однако имейте в виду, что Android может изменить это местоположение позже или даже изменить модель хранилища, и поэтому вы можете столкнуться с проблемами совместимости в будущем.

person CommonsWare    schedule 05.11.2010
comment
У меня было несколько вариантов сохранения настроек. Цель заключалась в простом способе взять текущие/глобальные префы (те, которые были отредактированы с помощью getDefault) и сохранить их копию где-то в момент, инициированный пользователем, чтобы дальнейшие изменения текущих/глобальных префов не влияли на сохраненную копию. Затем пользователь должен иметь возможность выбрать данную сохраненную копию, и эти настройки должны перезаписывать текущие/глобальные настройки. - person Josh; 05.11.2010
comment
Я мог бы использовать базу данных или собственный формат файла, но мне нужно было бы написать новый слой для хранения и восстановления кортежей ключ/тип/значение между базой данных или файлом и глобальными настройками. - person Josh; 05.11.2010
comment
Вместо этого я решил создать новый файл настроек, когда пользователь инициирует сохранение. Затем я просто перебираю глобальные префы, получаю каждое значение как универсальный объект, проверяю instanceof на наличие целых чисел, логических значений и т. д. и помещаюX() в новый файл. - person Josh; 05.11.2010
comment
Таким образом, я избегаю уровня перевода и сохраняю свои копии в том же формате, что и их источник (и конечный пункт назначения). Положительным моментом является простота обновления, поскольку мне не нужно беспокоиться о добавлении или удалении жестко закодированных столбцов таблицы в новых версиях. - person Josh; 05.11.2010
comment
Так что все это отлично работает, и единственным зависанием было избавление от этих файлов при удалении пользователем. Мне кажется, что независимо от того, как я использую эти новые pref-файлы, API должен предоставить способ их удаления, если он разрешает создание. - person Josh; 05.11.2010
comment
Кроме того, спасибо за уточнение местоположения файла, я подумал, что это может быть частью проблемы, но я не смог заставить оболочку DDMS/adb просмотреть его из-за разрешений. Можно ли просматривать там без рутированного устройства? Может быть, разрешены shared_prefs (вроде /баз данных)? - person Josh; 05.11.2010
comment
@Josh: Можно ли просматривать там без рутированного устройства? - использовать эмулятор. - person CommonsWare; 05.11.2010
comment
Привет! Оглядываясь на исходный код, нельзя ли использовать deleteFile для результата getSharedPrefsFile (имя строки)? Это должно обойти проблемы совместимости, которые вас беспокоили. android.git.kernel.org/?p=platform/frameworks/ - person Josh; 05.11.2010
comment
@Josh: в Android SDK нет функции getSharedPrefsFile(). - person CommonsWare; 05.11.2010
comment
Я знаю, что этого нет в документах, но источник для Context и ContextImpl говорит, что он реализован: android.git.kernel.org/?p=platform/frameworks/. Или это для следующей версии Android? (Не могу проверить это в коде до сегодняшнего вечера.) - person Josh; 05.11.2010
comment
@Josh: он реализован на Context, но с аннотацией @hide, поэтому он не является частью Android SDK. - person CommonsWare; 05.11.2010