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.

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.


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

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

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ą


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

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


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.


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

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

9

Wyczyść je wszystkie:

PreferenceManager.getDefaultSharedPreferences(context).edit().clear().apply()

8

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


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

7

Wypróbuj ten kod:

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

5

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

adb shell pm clear <package name>

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”.


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


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


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

1
new File(context.getFilesDir(), fileName).delete();

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


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

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


-2

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


-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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.