Як видалити дані спільних налаштувань із програми в 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.