Как удалить данные общих настроек из приложения в Android

478

Как удалить данные SharedPreferences для моего приложения?

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

Эндрю
источник

Ответы:

871

Чтобы удалить определенные значения: SharedPreferences.Editor.remove (), а затемcommit()

Чтобы удалить их все, SharedPreferences.Editor.clear()а затемcommit()

Если вас не волнует возвращаемое значение, и вы используете его из основного потока вашего приложения, рассмотрите возможность его использования apply().

Марк Б
источник
268
context.getSharedPreferences ("YOUR_PREFS", 0) .edit (). clear (). commit (); // удалите все свои настройки :)
rubdottocom
2
@yoshi определенно есть как remove (), так и clear (). Вы используете remove (), чтобы удалить определенные настройки, вы используете clear (), чтобы удалить их все. Первоначальный вопрос не был ясен, нужно ли им удалить их всех или нет.
Марк Б
9
Очистка файла настроек не приводит к его фактическому удалению. В моих собственных тестах, наблюдая за использованием «данных», перечисленных на панели «Информация о приложении», создание нового файла SharedPreference добавляет 4 КБ к этому значению, но использование editor.clear (). Commit () не уменьшает число.
Code Commander
2
@rubdottocom Почему бы вам не оставить свой комментарий как отдельный ответ?
технофил
10
@rubdottocom лучше использовать .apply () вместо .commit ()
Хуан Агилар Гисадо
173

Мое решение:

SharedPreferences preferences = getSharedPreferences("Mypref", 0);
preferences.edit().remove("text").commit();
Вайбхав Виджай
источник
2
Это удаляет только переменную TEXT?
Si8
3
@ SiKni8 Да, это удаляет только пару ключ / значение с ключом "text".
Деннис
Я смог заставить его работать, потому что это было давно, но спасибо за ответ :)
Si8
Вы сохранили мое абсолютное здравомыслие. : P СПАСИБО. Я пытался очистить префы для одного элемента объекта за раз, и это прекрасно работает.
Azurespot
3
Попробуйте применить apply () вместо commit () для выполнения задачи в фоновом потоке.
Зон
124

Удаление всех настроек:

SharedPreferences settings = context.getSharedPreferences("PreferencesName", Context.MODE_PRIVATE);
settings.edit().clear().commit();

Удаление одного предпочтения:

SharedPreferences settings = context.getSharedPreferences("PreferencesName", Context.MODE_PRIVATE);
settings.edit().remove("KeyName").commit();
zserghei
источник
1
Что будет KeyName?
hasnain_ahmad
2
Как удалить весь файл настроек, а не только настройки внутри файла?
Срикар Редди
Используйте apply () вместо commit () для выполнения задачи в фоновом потоке. commit () блокирует и мгновенно записывает данные в хранилище. apply () является асинхронным.
Вайбхав
64

Если нет необходимости удалять каждый раз, вы можете удалить его вручную из:

Настройки -> Приложения -> Управление приложениями -> (выберите приложение) -> Очистить данные или удалить

Новые версии Android:

Настройки -> Приложения -> (выберите приложение) -> Хранилище -> Очистить данные и Очистить кеш

Nobu
источник
5
Можем ли мы сделать это программно.
Дружище
@amity Другой ответ делает это программно.
Doomsknight
31
Спасибо за непрограммируемый вариант.
CorayThan
2
@amity - Некоторые из нас нуждались в этом ответе. Я не был уверен, как удалить SharedPrefs на эмуляторе Android, чтобы продолжить тестирование своего кода.
TJ Biddle
1
Нет там в андроид студии 2.2.2 18.10.2016.
Робин, как птица
26

Удаление общих настроек Android в одну строку :-)

context.getSharedPreferences("YOUR_PREFS", 0).edit().clear().commit();

Или applyдля неблокирующей асинхронной операции:

this.getSharedPreferences("YOUR_PREFS", 0).edit().clear().apply();
rubdottocom
источник
Лучшее решение для меня. Есть несколько случаев, когда синхронность необходима для контента с общими предпочтениями.
Хуан Агилар Гисадо
19

Кажется, что все решение не полностью работает или устарело

очистить все SharedPreferences в деятельности

PreferenceManager.getDefaultSharedPreferences(getBaseContext()).edit().clear().apply();

Вызовите это из основной активности после onCreate

примечание * я использовал .apply()вместо .commit(), вы можете выбрать commit ();

Shady Keshk
источник
именно то, что я хочу. Спасибо, это очищает все настройки по умолчанию
Arpit Patel
11

Вы можете использовать оболочку adb, чтобы сделать это даже без рутированного телефона. Единственный улов в том, что приложение должно быть отлаживаемым.

run-as <your package name> <command>

Например:

run-as com.asdf.blah rm /data/data/com.asdf.blah/databases/myDB.db

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

Джонсон Вонг
источник
1
+1 за полезный совет run-as. Вы могли бы подумать, что я нашел бы это через 3 года ...
Ричард Ле Мезурье
Это не общие предпочтения, это база данных sqlite
OneCricketeer
10
Editor editor = getSharedPreferences("clear_cache", Context.MODE_PRIVATE).edit();
editor.clear();
editor.commit();
Вайшали Сутария
источник
9

С API 24 (нуга) вы можете просто сделать:

context.deleteSharedPreferences("YOUR_PREFS");

Однако обратной совместимости нет, поэтому, если вы поддерживаете менее 24, придерживайтесь:

context.getSharedPreferences("YOUR_PREFS", Context.MODE_PRIVATE).edit().clear().apply(); 
afathman
источник
9

Очистить их все:

PreferenceManager.getDefaultSharedPreferences(context).edit().clear().apply()
Дан Алботяну
источник
8

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

wizurd
источник
Спасибо - я не хотел программно удалять sharedPreferences, так что это сработало для меня.
Симон
На моем устройстве у меня есть возможность «очистить данные» в опции удаления, которая сработала для меня и избавила от необходимости переустанавливать мое приложение.
G O'Rilla
8

В определениях классов:

private static final String PREFERENCES = "shared_prefs";

private static final SharedPreferences sharedPreferences  = getApplicationContext().getSharedPreferences(PREFERENCES, MODE_PRIVATE);

Внутри класса:

public static void deleteAllSharedPrefs(){
    sharedPreferences.edit().clear().commit();
}
SiVi
источник
7

Попробуйте этот код:

SharedPreferences sharedPreferences = getSharedPreferences("fake", Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sharedPreferences.edit();
edit.clear().commit();
Mubashshir
источник
5

Если это для вашего тестирования. Вы можете использовать команды ADB.

adb shell pm clear <package name>
Пракаш
источник
5
String prefTag = "someTag";
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(applicationContext);
prefs.edit().remove(prefTag).commit();

Это удалит сохраненные общие настройки с именем «someTag».

Киран кг
источник
3
  • Чтобы удалить конкретное значение,

SharedPreferences.Editor remove (String key), за которым следует commit () или apply ()

  • Чтобы удалить все значения,

    SharedPreferences.Editor clear (), за которым следует commit () или apply ()

Палак джайн
источник
3

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

getActivity().getSharedPreference().editor().remove("key").apply();

Я также разработал библиотеку для удобного управления общими настройками. Вы можете найти следующую ссылку

https://github.com/farruhha/SimplePrefs

Фаррух Хабибуллаев
источник
2

Чтобы централизованно очистить все SharedPreferences из любого класса:

public static SharedPreferences.Editor getEditor(Context context) {
    return getPreferences(context).edit();
}

И затем из любого класса: (commit возвращает логическое значение, где вы можете проверить, очищены ли ваши настройки или нет)

Navigation.getEditor(this).clear().commit();

Или вы можете использовать применить; это возвращает пустоту

Navigation.getEditor(this).clear().apply();
Суфиян Ансари
источник
1
new File(context.getFilesDir(), fileName).delete();

Я могу удалить файл в общих настройках с ним

Донг Фим Тайн
источник
Все вышеприведенные решения неверны, только удалить файл является правильным, чтобы удалить общие настройки
Dreamer
1

Ни один из ответов не работает для меня, так как у меня много общих ключей настроек.

Допустим, вы запускаете Android-тест вместо юнит-теста.

Это работает для меня цикл и удалить через все файлы shared_prefs .

@BeforeClass будет запущен до всех тестов и ActivityTestRule

@BeforeClass
public static void setUp() {
    Context context = InstrumentationRegistry.getTargetContext();

    File root = context.getFilesDir().getParentFile();
    String[] sharedPreferencesFileNames = new File(root, "shared_prefs").list();
    for (String fileName : sharedPreferencesFileNames) {
        context.getSharedPreferences(fileName.replace(".xml", ""), Context.MODE_PRIVATE).edit().clear().commit();
    }
}
Аллен
источник
0

В Котлине КОГО способ очистить все настройки:

val prefs: SharedPreferences = getSharedPreferences("prefsName", Context.MODE_PRIVATE)
prefs.edit(commit = true) {
    clear()
}

Нажмите здесь для всех операций с общими настройками с примерами

Paritosh
источник
-2

Вы можете использовать, preferences.edit().remove("key").commit()чтобы удалить сохраненные значения из общих настроек.

Ашиш Джайсвал
источник
-6

Просто сделал это сегодня утром. Из командной строки:

adb shell
cd /data/data/YOUR_PACKAGE_NAME/shared_prefs
rm * // to remove all shared preference files
rm YOUR_PREFS_NAME.xml // to remove a specific shared preference file

ПРИМЕЧАНИЕ . Для этого требуется рутованное устройство, такое как обычные виртуальные устройства Android, устройство Genymotion или телефон с рутованным подключением / планшет и т. Д.

kdahlhaus
источник
9
Поэтому, кто бы ни проголосовал за это решение, он, возможно, также объяснит, почему: вам нужен рутированный телефон для /data/dataпрямого доступа !
Нуала
3
Вам необходимо удалить SharedPreferences из приложения, а не из ADB Shell. Это делается с помощью: SharedPreferences.edit (). Clear (). Commit ();
ThePunisher
Спросил никогда не сказал, что они хотели бы без корневого решения. Здесь есть техническая ошибка; поскольку для этого метода требуется root, вам нужно запустить suпосле, adb shellчтобы открыть привилегированную оболочку.
Анубиан Нуб
Почему за это так много проголосовали? Это полезный ответ, который я искал.
Мэтт Д