So löschen Sie freigegebene Einstellungsdaten aus der App in Android


478

Wie lösche ich SharedPreferences-Daten für meine Anwendung?

Ich erstelle eine Anwendung, die viele Webdienste zum Synchronisieren von Daten verwendet. Zu Testzwecken muss ich beim Neustart der App einige SharedPreferences-Werte löschen.

Antworten:


871

So entfernen Sie bestimmte Werte: SharedPreferences.Editor.remove () gefolgt von acommit()

Um sie alle zu entfernen, SharedPreferences.Editor.clear()gefolgt von acommit()

Wenn Ihnen der Rückgabewert nicht wichtig ist und Sie ihn aus dem Hauptthread Ihrer Anwendung verwenden, sollten Sie ihn apply()stattdessen verwenden.


268
context.getSharedPreferences ("YOUR_PREFS", 0) .edit (). clear (). commit (); // entferne alle deine Vorlieben :)
rubdottocom

2
@yoshi gibt es definitiv ein remove () sowie ein clear (). Sie verwenden remove (), um bestimmte Einstellungen zu entfernen, und clear (), um alle Einstellungen zu entfernen. Die ursprüngliche Frage war nicht klar, ob sie alle entfernen mussten oder nicht.
Mark B

9
Das Löschen der Voreinstellungsdatei scheint sie nicht tatsächlich zu löschen. Wenn ich in meinen eigenen Tests die im Bereich "App-Info" aufgeführte Verwendung von "Daten" beobachte, erhöht das Erstellen einer neuen SharedPreference-Datei diesen Wert um 4 KB, aber die Verwendung von editor.clear (). Commit () verringert die Anzahl nicht.
Code Commander

2
@rubdottocom Warum stellst du deinen Kommentar nicht als separate Antwort ein?
Technophyle

10
@ Rubdottocom besser mit .apply () anstelle von .commit ()
Juan Aguilar Guisado

173

Meine Lösung:

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

2
Entfernt das nur die Variable TEXT?
Si8

3
@ SiKni8 Ja, das entfernt nur das Schlüssel / Wert-Paar mit dem Schlüssel "text".
Dennis

Ich konnte es zum
Laufen

Du hast meine absolute Gesundheit gerettet. : P DANKE. Ich habe versucht, die Einstellungen für jeweils ein Element eines Objekts zu löschen, und das funktioniert wunderbar.
Azurespot

3
Verwenden Sie apply () anstelle von commit (), um die Aufgabe in einem Hintergrundthread auszuführen.
Zon

124

Alle Einstellungen entfernen:

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

Einzelne Präferenz entfernen:

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

1
Was wird das sein KeyName?
hasnain_ahmad

2
Wie lösche ich die gesamte Voreinstellungsdatei, nicht nur die Voreinstellungen in der Datei?
Srikar Reddy

Verwenden Sie apply () anstelle von commit (), um die Aufgabe in einem Hintergrundthread auszuführen. commit () blockiert und schreibt Daten sofort in den Speicher. apply () ist asynchron.
Vaibhav

64

Wenn nicht jedes Mal entfernt werden muss, können Sie es manuell entfernen aus:

Einstellungen -> Anwendungen -> Anwendungen verwalten -> (App auswählen) -> Daten löschen oder deinstallieren

Neuere Versionen von Android:

Einstellungen -> Anwendungen -> (wählen Sie Ihre App) -> Speicher -> Daten löschen und Cache löschen


5
Können wir diese Dinge programmatisch machen?
Freundschaft

@amity Die andere Antwort macht es programmatisch.
Doomsknight

31
Vielen Dank für eine nicht programmatische Option.
CorayThan

2
@amity - Einige von uns brauchten diese Antwort. Ich war mir nicht sicher, wie ich SharedPrefs auf einem Android-Emulator entfernen sollte, damit ich meinen Code weiter testen konnte.
TJ Biddle

1
Nicht dort in Android Studio 2.2.2 18.10.2016.
Robin wie der Vogel

26

Gemeinsame Android-Einstellungen in einer Zeile löschen :-)

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

Oder applyfür nicht blockierenden asynchronen Betrieb:

this.getSharedPreferences("YOUR_PREFS", 0).edit().clear().apply();

Beste Lösung für mich. Es gibt nur wenige Fälle, in denen für Inhalte mit gemeinsam genutzten Einstellungen eine Synchronisierung erforderlich ist.
Juan Aguilar Guisado

19

Scheint, dass nicht alle Lösungen vollständig funktionieren oder tot sind

um alle SharedPreferences in einer Aktivität zu löschen

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

Rufen Sie dies in der Hauptaktivität nach onCreate auf

note * Ich habe .apply()stattdessen verwendet .commit(), Sie können Commit () frei wählen;


genau das was ich will. Dank es löscht alle Standardeinstellungen
Arpit Patel

11

Sie können die ADB-Shell verwenden, um dies auch ohne ein gerootetes Telefon zu tun. Der einzige Haken ist, dass die App debuggbar sein muss.

run-as <your package name> <command>

Zum Beispiel:

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

Alternativ können Sie einfach das oben Genannte ausführen, jedoch ohne den Befehl, der Sie zum Stamm des App-Pakets weiterleitet und es Ihnen ermöglicht, weitere Befehle im Kontext der App auszuführen.


1
+1 für den nützlichen Tipp run-as. Sie würden denken, ich hätte dies nach 3 Jahren gefunden ...
Richard Le Mesurier

Dies ist nicht die Sharedpreferences, es ist die SQLite-Datenbank
OneCricketeer

10
Editor editor = getSharedPreferences("clear_cache", Context.MODE_PRIVATE).edit();
editor.clear();
editor.commit();

9

Ab API 24 (Nougat) können Sie einfach Folgendes tun:

context.deleteSharedPreferences("YOUR_PREFS");

Es gibt jedoch keine Abwärtskompatibilität. Wenn Sie also weniger als 24 unterstützen, bleiben Sie bei:

context.getSharedPreferences("YOUR_PREFS", Context.MODE_PRIVATE).edit().clear().apply(); 

9

Lösche sie alle:

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

8

Sie können Ihre App auch einfach manuell mit Ihrem Gerät deinstallieren. Wenn Sie Ihre App erneut installieren, wurden die freigegebenen Einstellungen zurückgesetzt.


Vielen Dank - ich wollte sharedPreferences nicht programmgesteuert entfernen, daher funktionierte dies für mich.
Simon

Auf meinem Gerät habe ich die Option "Daten löschen" bei der Deinstallationsoption, die für mich funktioniert hat und die Notwendigkeit einer Neuinstallation meiner App beseitigt.
G O'Rilla

8

In den Klassendefinitionen:

private static final String PREFERENCES = "shared_prefs";

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

Innerhalb der Klasse:

public static void deleteAllSharedPrefs(){
    sharedPreferences.edit().clear().commit();
}

7

Versuchen Sie diesen Code:

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

5

Wenn es für Ihre Tests ist. Sie können adb-Befehle verwenden.

adb shell pm clear <package name>

5
String prefTag = "someTag";
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(applicationContext);
prefs.edit().remove(prefTag).commit();

Dadurch werden die gespeicherten freigegebenen Einstellungen mit dem Namen "someTag" gelöscht.


3
  • Um einen bestimmten Wert zu entfernen,

SharedPreferences.Editor remove (String key) gefolgt von einem commit () oder einem apply ()

  • Um alle Werte zu entfernen,

    SharedPreferences.Editor clear () gefolgt von einem commit () oder einem apply ()


3

Um die Schlüsselwertpaare aus den Einstellungen zu entfernen, können Sie auf einfache Weise Folgendes tun

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

Ich habe auch eine Bibliothek zur einfachen Bearbeitung gemeinsamer Einstellungen entwickelt. Möglicherweise finden Sie den folgenden Link

https://github.com/farruhha/SimplePrefs


2

So löschen Sie alle SharedPreferences zentral aus einer beliebigen Klasse:

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

Und dann aus jeder Klasse: (Commit gibt einen Booleschen Wert zurück, mit dem Sie überprüfen können, ob Ihre Einstellungen gelöscht wurden oder nicht.)

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

Oder Sie können anwenden verwenden; es kehrt ungültig zurück

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

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

Ich kann damit Dateien in freigegebenen Einstellungen löschen


Alle oben genannten Lösungen sind falsch, nur die Datei löschen ist richtig, um gemeinsame Einstellungen zu löschen
Dreamer

1

Keine der Antworten funktioniert für mich, da ich viele gemeinsame Einstellungsschlüssel habe.

Angenommen, Sie führen einen Android-Test anstelle eines Komponententests durch.

Es funktioniert für mich Schleife und Löschen durch alle shared_prefs- Dateien.

@BeforeClass wird vor allen Tests und ActivityTestRule ausgeführt

@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

Der Kotlin ktx Weg, um alle Einstellungen zu löschen :

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

Klicken Sie hier, um alle Vorgänge für freigegebene Einstellungen mit Beispielen anzuzeigen


-2

Sie können preferences.edit().remove("key").commit()gespeicherte Werte aus freigegebenen Einstellungen löschen.


-6

Hab das heute morgen gemacht. An einer Eingabeaufforderung:

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

HINWEIS : Hierfür ist ein gerootetes Gerät erforderlich, z. B. die gängigen virtuellen Android-Geräte, ein Genymotion-Gerät oder ein tatsächlich gerootetes Mobilteil / Tablet usw.


9
Wer diese Lösung abgelehnt hat, sollte vielleicht auch erklären, warum: Sie benötigen ein verwurzeltes Telefon, um /data/datadirekt darauf zugreifen zu können!
Nuala

3
Sie müssen die SharedPreferences aus der Anwendung und nicht aus der ADB-Shell entfernen. Dies geschieht mit: SharedPreferences.edit (). Clear (). Commit ();
ThePunisher

Gefragt sagte nie, sie wollten eine Lösung ohne Wurzel. Hier liegt jedoch ein technischer Fehler vor. da diese Methode Wurzel erfordert, müssen Sie laufen sunach adb shellzu öffnen , eine privilegierte Shell.
Anubian Noob

Warum wurde das so herabgestuft? Dies ist eine nützliche Antwort und die, nach der ich gesucht habe.
Matt D
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.