Як видалити дані спільних налаштувань із програми в Android


478

Як видалити дані SharedPreferences для своєї програми?

Я створюю додаток, який використовує безліч веб-служб для синхронізації даних. Для тестування мені потрібно стерти деякі значення SharedPreferences під час перезавантаження програми.

Відповіді:


870

Для видалення конкретних значень: SharedPreferences.Editor.remove (), а потім acommit()

Щоб видалити їх, SharedPreferences.Editor.clear()слідує acommit()

Якщо вам не байдуже значення, що повертається, і ви використовуєте це з основного потоку програми, подумайте про використання apply().


268
контекст.getSharedPreferences ("YOUR_PREFS", 0) .edit (). clear (). commit (); // видаліть усі свої префікси :)
rubdottocom

2
@yoshi, безумовно, є remove (), а також clear (). Ви використовуєте delete () для видалення певних налаштувань, ви використовуєте clear (), щоб видалити їх усі. Оригінальне питання не було зрозумілим, чи потрібно їх видалити чи ні.
Марк Б

9
Очищення файлу налаштувань не видаляє його фактично. В моїх власних тестах, спостерігаючи за використанням даних "Дані", переліченими на панелі Інформація про додаток, створення нового файлу SharedPreference додає до цього значення 4 КБ, але за допомогою editor.clear (). Commit () кількість не зменшує.
Командир коду

2
@rubdottocom Чому ви не викладете свій коментар як окрему відповідь?
технофіл

10
@rubdottocom краще використовувати .apply () замість .commit ()
Juan Aguilar Guisado

173

Моє рішення:

SharedPreferences preferences = getSharedPreferences("Mypref", 0);
preferences.edit().remove("text").commit();

2
Це видаляє лише змінну TEXT?
Si8

3
@ SiKni8 Так, це видаляє лише пару ключ / значення з ключем "text".
Денніс

Мені вдалося змусити його працювати, тому що
минув

Ти врятував мою абсолютну розсудливість. : P ДЯКУЮ ВАМ Я намагався одночасно очистити префікси для одного елемента об’єкта, і це прекрасно працює.
Azurespot

3
Подумайте про використання завдання () замість 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 (), щоб виконати завдання у фоновому потоці. виконувати () блокувати та записувати дані у сховище миттєво. apply () є асинхронним.
Vaibhav

64

Якщо видаляти її не потрібно кожного разу, ви можете видалити її вручну з:

Установки -> Програми -> Керування програмами -> (виберіть додаток) -> Очистити дані або Видалити

Новіші версії Android:

Налаштування -> Програми -> (виберіть додаток) -> Зберігання -> Очистити дані та Очистити кеш


5
чи можемо ми це зробити програмно.
amity

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

Найкраще рішення для мене. Немало випадків, коли синхронність не потрібна для вмісту загальних налаштувань.
Juan Aguilar Guisado

19

Здається, що все рішення не є повністю працюючим або відмерлим

щоб очистити всі параметри спільного доступу до активності

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 видалити (Строкова клавіша) з подальшим введенням () або застосувати ()

  • Щоб видалити всі значення,

    SharedPreferences.Editor clear () з подальшим зобов'язанням () або застосувати ()


3

Щоб видалити пари ключових значень із переваг, ви можете легко виконати наступне

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

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

https://github.com/farruhha/SimplePrefs


2

Щоб центрально очистити всі параметри спільного доступу з будь-якого класу:

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

І тоді з будь-якого класу: (команда повертає булевий файл, де ви можете перевірити, чи очищені ваші налаштування чи ні)

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. Це робиться за допомогою: SharedPreferences.edit (). Clear (). Commit ();
ThePunisher

Запитані ніколи не говорили, що не хочуть кореневого рішення. Тут є технічна помилка; так як цей метод вимагає кореня, ви повинні запустити suпісля adb shellвідкрити привілейовану оболонку.
Anubian Noob

Чому це було так заборонено? Це корисна відповідь і та, яку я шукав.
Matt D
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.