Jak usunąć dane preferencji udostępnionych z aplikacji w systemie Android

478

Jak usunąć dane SharedPreferences dla mojej aplikacji?

Tworzę aplikację, która korzysta z wielu usług internetowych do synchronizacji danych. Do celów testowych muszę wymazać niektóre wartości SharedPreferences po ponownym uruchomieniu aplikacji.

Andrzej
źródło

Odpowiedzi:

870

Aby usunąć określone wartości: SharedPreferences.Editor.remove (), a następniecommit()

Aby usunąć je wszystkie SharedPreferences.Editor.clear() a następniecommit()

Jeśli nie zależy ci na wartości zwracanej i używasz jej z głównego wątku aplikacji, rozważ użycie apply()zamiast niej.

Mark B
źródło
268
context.getSharedPreferences („YOUR_PREFS”, 0) .edit (). clear (). commit (); // usuń wszystkie swoje preferencje :)
rubdottocom,
2
@yoshi jest zdecydowanie remove (), a także clear (). Używasz remove (), aby usunąć określone preferencje, użyj clear (), aby usunąć je wszystkie. Pierwotne pytanie nie było jasne, czy trzeba je wszystkie usunąć, czy nie.
Mark B,
9
Wyczyszczenie pliku preferencji nie wydaje się, aby faktycznie go usunąć. W moich własnych testach, obserwując użycie „Dane” wymienione w panelu Informacje o aplikacji, utworzenie nowego pliku SharedPreference dodaje 4KB do tej wartości, ale użycie editor.clear (). Commit () nie zmniejsza liczby.
Code Commander
2
@rubdottocom Dlaczego nie umieścisz swojego komentarza jako osobnej odpowiedzi?
technophyle
10
@rubdottocom lepiej użyć .apply () zamiast .commit ()
Juan Aguilar Guisado
173

Moje rozwiązanie:

SharedPreferences preferences = getSharedPreferences("Mypref", 0);
preferences.edit().remove("text").commit();
Vaibhav Vijay
źródło
2
Czy to usuwa tylko zmienną TEXT?
Si8
3
@ SiKni8 Tak, usuwa tylko parę klucz / wartość z kluczem "text".
Dennis
Udało mi się go uruchomić, ponieważ minęło trochę czasu, ale dziękuję za odpowiedź :)
Si8
Uratowałeś moje absolutne zdrowie psychiczne. : P DZIĘKUJĘ. Próbowałem wyczyścić preferencje dla jednego elementu obiektu na raz, a to działa pięknie.
Azurespot
3
Rozważ użycie metody Apply () zamiast commit () do wykonania zadania w wątku w tle.
Strefa
124

Usuwanie wszystkich preferencji:

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

Usuwanie pojedynczej preferencji:

SharedPreferences settings = context.getSharedPreferences("PreferencesName", Context.MODE_PRIVATE);
settings.edit().remove("KeyName").commit();
zserghei
źródło
1
Co będzie KeyName?
hasnain_ahmad
2
Jak usunąć cały plik preferencji, a nie tylko preferencje w pliku?
Srikar Reddy,
Użyj Apply () zamiast commit (), aby wykonać zadanie w tle. bloki commit () i natychmiast zapisują dane do pamięci. Apply () jest asynchroniczny.
Vaibhav
64

Jeśli nie trzeba go usuwać za każdym razem, możesz usunąć go ręcznie z:

Ustawienia -> Aplikacje -> Zarządzaj aplikacjami -> (wybierz aplikację) -> Wyczyść dane lub Odinstaluj

Nowsze wersje Androida:

Ustawienia -> Aplikacje -> (wybierz aplikację) -> Pamięć -> Wyczyść dane i Wyczyść pamięć podręczną

Nobu
źródło
5
czy możemy to zrobić programowo.
amity
@ amity Druga odpowiedź robi to programowo.
Doomsknight
31
Dzięki za nieprogramową opcję.
CorayThan
2
@amity - Niektórzy z nas potrzebowali tej odpowiedzi. Nie byłem pewien, jak usunąć SharedPrefs na emulatorze Androida, aby móc kontynuować testowanie mojego kodu.
TJ Biddle
1
Nie ma w Android Studio 2.2.2 18.10.2016.
Robin jak ptak
26

Usuwanie wspólnych preferencji Androida w jednym wierszu :-)

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

Lub applyw przypadku nieblokującej operacji asynchronicznej:

this.getSharedPreferences("YOUR_PREFS", 0).edit().clear().apply();
rubdottocom
źródło
Najlepsze rozwiązanie dla mnie. Istnieje kilka przypadków, w których synchronizacja jest niezbędna w przypadku treści o wspólnych preferencjach.
Juan Aguilar Guisado
19

Wydaje się, że wszystkie rozwiązania nie działają całkowicie lub są całkowicie martwe

aby wyczyścić wszystkie SharedPreferences w działaniu

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

Zadzwoń do tego z głównej aktywności po utworzeniu usługi onCreate

uwaga * użyłem .apply()zamiast .commit(), możesz wybrać commit ();

Shady Keshk
źródło
dokładnie to, czego chcę. Dzięki temu usuwa wszystkie domyślne preferencje
Arpit Patel
11

Możesz użyć powłoki adb, aby to zrobić nawet bez zrootowanego telefonu. Jedynym haczykiem jest to, że aplikacja musi być debuggowana.

run-as <your package name> <command>

Na przykład:

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

Alternatywnie możesz po prostu zrobić powyższe, ale bez polecenia, które przekieruje Cię do katalogu głównego pakietu aplikacji i pozwoli ci wykonać więcej poleceń w kontekście aplikacji.

Johnson Wong
źródło
1
+1 za przydatną wskazówkę run-as. Można by pomyśleć, że znalazłbym to po 3 latach ...
Richard Le Mesurier
To nie jest Sharedpreferences, to baza danych sqlite
OneCricketeer
10
Editor editor = getSharedPreferences("clear_cache", Context.MODE_PRIVATE).edit();
editor.clear();
editor.commit();
Vaishali Sutariya
źródło
9

Od API 24 (Nougat) możesz po prostu:

context.deleteSharedPreferences("YOUR_PREFS");

Jednak nie ma kompatybilności wstecznej, więc jeśli wspierasz coś mniej niż 24, trzymaj się:

context.getSharedPreferences("YOUR_PREFS", Context.MODE_PRIVATE).edit().clear().apply(); 
afathman
źródło
9

Wyczyść je wszystkie:

PreferenceManager.getDefaultSharedPreferences(context).edit().clear().apply()
Dan Alboteanu
źródło
8

Możesz także ręcznie odinstalować aplikację za pomocą urządzenia. Po ponownym zainstalowaniu aplikacji preferencje udostępnione zostały zresetowane.

wizurd
źródło
Dzięki - nie chciałem programowo usuwać sharedPreferences, więc to zadziałało dla mnie.
Simon
Na moim urządzeniu mam opcję „wyczyść dane” w opcji odinstalowania, która działała dla mnie i usunęła potrzebę ponownej instalacji mojej aplikacji.
G O'Rilla,
8

W definicjach klas:

private static final String PREFERENCES = "shared_prefs";

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

Wewnątrz klasy:

public static void deleteAllSharedPrefs(){
    sharedPreferences.edit().clear().commit();
}
sivi
źródło
7

Wypróbuj ten kod:

SharedPreferences sharedPreferences = getSharedPreferences("fake", Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sharedPreferences.edit();
edit.clear().commit();
Mubashshir
źródło
5

Jeśli to do testowania. Możesz użyć poleceń adb.

adb shell pm clear <package name>
Prakash
źródło
5
String prefTag = "someTag";
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(applicationContext);
prefs.edit().remove(prefTag).commit();

Spowoduje to usunięcie zapisanych wspólnych preferencji o nazwie „someTag”.

Kiran kg
źródło
3
  • Aby usunąć określoną wartość,

SharedPreferences.Editor remove (String string), a następnie commit () lub apply ()

  • Aby usunąć wszystkie wartości,

    SharedPreferences.Editor clear (), po której następuje commit () lub apply ()

Palak Jain
źródło
3

Aby usunąć pary klucz-wartość z preferencji, możesz łatwo wykonać następujące czynności

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

Opracowałem również bibliotekę do łatwej manipulacji wspólnymi preferencjami. Możesz znaleźć następujący link

https://github.com/farruhha/SimplePrefs

Farruh Habibullaev
źródło
2

Aby wyczyścić wszystkie SharedPreferences centralnie z dowolnej klasy:

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

A następnie z dowolnej klasy: (commit zwraca wartość logiczną, gdzie możesz sprawdzić, czy Preferencje zostały wyczyszczone)

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

Lub możesz użyć zastosowania; zwraca pustkę

Navigation.getEditor(this).clear().apply();
Sufiyan Ansari
źródło
1
new File(context.getFilesDir(), fileName).delete();

Mogę z nim usunąć plik w preferencjach udostępnionych

Dũng Phạm Tiến
źródło
Wszystkie powyższe rozwiązania są błędne, tylko usuń plik jest odpowiedni do usunięcia wspólnych preferencji
Dreamer
1

Żadna z odpowiedzi nie działa dla mnie, ponieważ mam wiele wspólnych kluczy preferencji.

Załóżmy, że przeprowadzasz test systemu Android zamiast testu jednostkowego.

Działa dla mnie pętla i usuwanie przez wszystkie pliki shared_prefs .

@BeforeClass uruchomi się przed wszystkimi testami i 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();
    }
}
Allen
źródło
0

Sposób Kotlin ktx, aby wyczyścić wszystkie preferencje:

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

Kliknij tutaj, aby wyświetlić wszystkie operacje na preferencjach współdzielonych z przykładami

Paritosh
źródło
-2

Możesz użyć preferences.edit().remove("key").commit()do usunięcia zapisanych wartości z wspólnych preferencji.

Ashish Jaiswal
źródło
-6

Właśnie to zrobiłem dziś rano. Z wiersza polecenia:

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

UWAGA : Wymaga to zrootowanego urządzenia, takiego jak standardowe urządzenia wirtualne z Androidem, urządzenie Genymotion lub rzeczywisty zrootowany telefon / tablet itp.

kdahlhaus
źródło
9
Każdy, kto głosował na to rozwiązanie, może również wyjaśnić dlaczego: Potrzebujesz zrootowanego telefonu, aby uzyskać /data/databezpośredni dostęp !
nuala
3
Musisz usunąć SharedPreferences z aplikacji, a nie powłoki ADB. Wykonuje się to za pomocą: SharedPreferences.edit (). Clear (). Commit ();
ThePunisher
Zapytany nigdy nie powiedział, że nie chce rozwiązania root. Wystąpił tutaj błąd techniczny; ponieważ ta metoda wymaga roota, musisz uruchomić supóźniej, adb shellaby otworzyć uprzywilejowaną powłokę.
Anubian Noob
Dlaczego to tak bardzo nie doceniono? To przydatna odpowiedź, której szukałem.
Matt D