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.