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.

Andrew
quelle

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.

Mark B.
quelle
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();
vaibhav vijay
quelle
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();
zserghei
quelle
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

Nobu
quelle
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();
rubdottocom
quelle
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;

Schattiger Keshk
quelle
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.

Johnson Wong
quelle
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();
Vaishali Sutariya
quelle
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(); 
Afathman
quelle
9

Lösche sie alle:

PreferenceManager.getDefaultSharedPreferences(context).edit().clear().apply()
Dan Alboteanu
quelle
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.

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

Versuchen Sie diesen Code:

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

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

adb shell pm clear <package name>
Prakash
quelle
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.

Kiran kg
quelle
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 ()

Palak Jain
quelle
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

Farruh Habibullaev
quelle
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();
Sufiyan Ansari
quelle
1
new File(context.getFilesDir(), fileName).delete();

Ich kann damit Dateien in freigegebenen Einstellungen löschen

Dũng Phạm Tiến
quelle
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();
    }
}
Allen
quelle
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

Paritosh
quelle
-2

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

Ashish Jaiswal
quelle
-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.

kdahlhaus
quelle
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