Come eliminare i dati delle preferenze condivise dall'app in Android


478

Come posso eliminare i dati di SharedPreferences per la mia applicazione?

Sto creando un'applicazione che utilizza molti servizi Web per sincronizzare i dati. A scopo di test, è necessario cancellare alcuni valori di SharedPreferences al riavvio dell'app.

Risposte:


871

Per rimuovere valori specifici: SharedPreferences.Editor.remove () seguito da acommit()

Per rimuoverli tutti SharedPreferences.Editor.clear()seguiti da acommit()

Se non ti interessa il valore restituito e lo stai utilizzando dal thread principale dell'applicazione, prendi in considerazione l'utilizzo apply().


268
context.getSharedPreferences ("YOUR_PREFS", 0) .edit (). clear (). commit (); // rimuovi tutte le tue
preferenze

2
@yoshi c'è sicuramente un remove () oltre a un clear (). Usa remove () per rimuovere preferenze specifiche, usi clear () per rimuoverle tutte. La domanda originale non era chiara se dovevano rimuoverli tutti o no.
Mark B,

9
La cancellazione del file delle preferenze non sembra eliminarlo effettivamente. Nei miei test osservando l'utilizzo di "Dati" elencato nel pannello Informazioni app, la creazione di un nuovo file SharedPreference aggiunge 4KB a questo valore ma l'utilizzo di editor.clear (). Commit () non riduce il numero.
Codice comandante

2
@rubdottocom Perché non inserisci il tuo commento come risposta separata?
tecnophyle,

10
@rubdottocom è meglio usare .apply () invece di .commit ()
Juan Aguilar Guisado il

173

La mia soluzione:

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

2
Rimuove solo la variabile TEXT?
Si8

3
@ SiKni8 Sì, rimuove solo la coppia chiave / valore con chiave "text".
Dennis,

Sono stato in grado di farlo funzionare perché è passato un po 'ma grazie per la risposta :)
Si8

Mi hai salvato la mia sanità mentale assoluta. : P GRAZIE. Stavo cercando di cancellare le preferenze per un elemento di un oggetto alla volta, e questo funziona magnificamente.
Azurespot

3
Prendi in considerazione l'utilizzo di apply () invece di commit () per eseguire l'attività in un thread in background.
Zon,

124

Rimozione di tutte le preferenze:

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

Rimozione della preferenza singola:

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

1
Quale sarà il KeyName?
hasnain_ahmad,

2
Come eliminare l'intero file delle preferenze, non solo le preferenze all'interno del file?
Srikar Reddy l'

Utilizzare apply () anziché commit () per eseguire l'attività in un thread in background. commit () blocca e scrive istantaneamente i dati nella memoria. apply () è asincrono.
Vaibhav,

64

Se non è necessario rimuoverlo ogni volta, è possibile rimuoverlo manualmente da:

Impostazioni -> Applicazioni -> Gestisci applicazioni -> (scegli la tua app) -> Cancella dati o Disinstalla

Versioni più recenti di Android:

Impostazioni -> Applicazioni -> (scegli la tua app) -> Archiviazione -> Cancella dati e Cancella cache


5
possiamo fare queste cose a livello di programmazione.
Amity,

@amity L'altra risposta lo fa programmaticamente.
Doomsknight,

31
Grazie per un'opzione non programmatica.
Coray,

2
@amity - Alcuni di noi avevano bisogno di questa risposta. Non ero sicuro di come rimuovere SharedPrefs su un emulatore Android in modo da poter continuare a testare il mio codice.
TJ Biddle,

1
Non c'è in Android Studio 2.2.2 18/10/2016.
Robin piace l'uccello il

26

Eliminazione delle preferenze condivise Android in una riga :-)

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

O applyper operazioni asincrone non bloccanti:

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

La migliore soluzione per me. Ci sono pochi casi in cui sincrono è necessario per il contenuto delle preferenze condivise.
Juan Aguilar Guisado,

19

Sembra che tutte le soluzioni non funzionino completamente o siano completamente morte

per cancellare tutte le preferenze condivise in un'attività

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

Chiamalo dall'attività principale dopo onCreate

nota * ho usato .apply()invece di .commit(), sei libero di scegliere commit ();


esattamente quello che voglio. Grazie cancella tutte le preferenze predefinite
Arpit Patel

11

Puoi usare la shell adb per farlo anche senza un telefono rootato. L'unico problema è che l'app deve essere debuggabile.

run-as <your package name> <command>

Per esempio:

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

In alternativa, puoi fare quanto sopra, ma senza il comando che ti indirizzerà alla radice del pacchetto dell'app e ti consentirà di eseguire più comandi nel contesto dell'app.


1
+1 per il suggerimento utile su run-as. Penseresti che l'avrei trovato dopo 3 anni ...
Richard Le Mesurier,

Questa non è la condivisione condivisa, è il database sqlite
OneCricketeer

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

9

A partire da API 24 (Nougat) puoi semplicemente fare:

context.deleteSharedPreferences("YOUR_PREFS");

Tuttavia, non esiste alcuna compatibilità con le versioni precedenti, quindi se stai supportando qualcosa di meno di 24, segui:

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

9

Cancella tutto:

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

8

Puoi anche disinstallare manualmente la tua app utilizzando il tuo dispositivo. Quindi, quando reinstalli l'app, le preferenze condivise sono state ripristinate.


Grazie - non volevo rimuovere programmaticamente condivise preferenze quindi questo ha funzionato per me.
Simon,

Sul mio dispositivo ho l'opzione di "cancellare i dati" sull'opzione di disinstallazione, che ha funzionato per me e rimosso la necessità di reinstallare la mia app.
G O'Rilla,

8

Nelle definizioni di classe:

private static final String PREFERENCES = "shared_prefs";

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

All'interno della classe:

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

7

Prova questo codice:

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

5

Se è per i tuoi test. Puoi usare i comandi adb.

adb shell pm clear <package name>

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

Ciò eliminerà le preferenze condivise salvate con il nome "someTag".


3
  • Per rimuovere un valore particolare,

SharedPreferences.Editor remove (String key) seguito da un commit () o un apply ()

  • Per rimuovere tutti i valori,

    SharedPreferences.Editor clear () seguito da un commit () o un apply ()


3

Per rimuovere le coppie di valori chiave dalle preferenze, è possibile effettuare facilmente le seguenti operazioni

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

Ho anche sviluppato una libreria per una facile manipolazione delle preferenze condivise. È possibile trovare il seguente link

https://github.com/farruhha/SimplePrefs


2

Per cancellare tutte le condivisioni condivise centralmente da qualsiasi classe:

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

E poi da qualsiasi classe: (commit restituisce un valore booleano in cui è possibile verificare se le Preferenze sono state cancellate o meno)

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

Oppure puoi usare applicare; ritorna vuoto

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

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

Posso eliminare il file nelle preferenze condivise con esso


Tutte le soluzioni sopra sono sbagliate, solo l'eliminazione del file è quella giusta per eliminare le preferenze condivise
Dreamer

1

Nessuna delle risposte funziona per me poiché ho molte chiavi delle preferenze condivise.

Supponiamo che tu stia eseguendo un Android Test anziché un unit test.

Funziona per me loop ed elimina tutti i file shared_prefs .

@BeforeClass verrà eseguito prima di tutti i test e 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

Il modo kotx di Kotlin per cancellare tutte le preferenze:

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

Fare clic qui per tutte le operazioni relative alle preferenze condivise con esempi


-2

È possibile utilizzare preferences.edit().remove("key").commit()per eliminare i valori salvati dalle preferenze condivise.


-6

L'ho fatto stamattina. Da un prompt dei comandi:

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

NOTA : ciò richiede un dispositivo rooted come i dispositivi virtuali Android stock, un dispositivo Genymotion o un vero telefono / tablet rooted, ecc.


9
Quindi chiunque abbia votato a favore di questa soluzione dovrebbe forse anche spiegare il perché: è necessario un telefono rooted per accedere /data/datadirettamente!
nuala,

3
È necessario rimuovere SharedPreferences dall'applicazione e non dalla shell ADB. Viene eseguita utilizzando: SharedPreferences.edit (). Clear (). Commit ();
ThePunisher,

Chiesto non ha mai detto di voler una soluzione senza radice. C'è un errore tecnico qui però; poiché questo metodo richiede root, è necessario eseguire sudopo adb shellper aprire una shell privilegiata.
Anubian Noob,

Perché questo downvoting è stato così tanto? Questa è una risposta utile e quella che stavo cercando.
Matt D
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.