Как удалить данные общих настроек из приложения в 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();

1
Что будет KeyName?
hasnain_ahmad

2
Как удалить весь файл настроек, а не только настройки внутри файла?
Срикар Редди

Используйте apply () вместо commit () для выполнения задачи в фоновом потоке. commit () блокирует и мгновенно записывает данные в хранилище. apply () является асинхронным.
Вайбхав

64

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

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

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

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


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();

Лучшее решение для меня. Есть несколько случаев, когда синхронность необходима для контента с общими предпочтениями.
Хуан Агилар Гисадо

19

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

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

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

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

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


именно то, что я хочу. Спасибо, это очищает все настройки по умолчанию
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


9

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

context.deleteSharedPreferences("YOUR_PREFS");

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

context.getSharedPreferences("YOUR_PREFS", Context.MODE_PRIVATE).edit().clear().apply(); 


8

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


Спасибо - я не хотел программно удалять 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();
}

7

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

SharedPreferences sharedPreferences = getSharedPreferences("fake", Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sharedPreferences.edit();
edit.clear().commit();

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()
}

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


-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 или телефон с рутованным подключением / планшет и т. Д.


9
Поэтому, кто бы ни проголосовал за это решение, он, возможно, также объяснит, почему: вам нужен рутированный телефон для /data/dataпрямого доступа !
Нуала

3
Вам необходимо удалить SharedPreferences из приложения, а не из ADB Shell. Это делается с помощью: SharedPreferences.edit (). Clear (). Commit ();
ThePunisher

Спросил никогда не сказал, что они хотели бы без корневого решения. Здесь есть техническая ошибка; поскольку для этого метода требуется root, вам нужно запустить suпосле, adb shellчтобы открыть привилегированную оболочку.
Анубиан Нуб

Почему за это так много проголосовали? Это полезный ответ, который я искал.
Мэтт Д
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.