Comment supprimer les données de préférences partagées de l'application sur Android

478

Comment supprimer les données SharedPreferences de mon application?

Je crée une application qui utilise de nombreux services Web pour synchroniser les données. À des fins de test, je dois effacer certaines valeurs SharedPreferences lorsque je redémarre l'application.

Andrew
la source

Réponses:

871

Pour supprimer des valeurs spécifiques: SharedPreferences.Editor.remove () suivi d'uncommit()

Pour les supprimer tous SharedPreferences.Editor.clear()suivi d'uncommit()

Si vous ne vous souciez pas de la valeur de retour et que vous l'utilisez à partir du thread principal de votre application, envisagez d'utiliser à la apply()place.

Mark B
la source
268
context.getSharedPreferences ("YOUR_PREFS", 0) .edit (). clear (). commit (); // supprime toutes tes préférences :)
rubdottocom
2
@yoshi il y a certainement un remove () ainsi qu'un clear (). Vous utilisez remove () pour supprimer des préférences spécifiques, vous utilisez clear () pour les supprimer toutes. La question initiale n'était pas claire s'ils avaient besoin de les supprimer tous ou non.
Mark B
9
L'effacement du fichier de préférences ne semble pas le supprimer. Dans mes propres tests en observant l'utilisation des «données» répertoriée dans le panneau Informations sur l'application, la création d'un nouveau fichier SharedPreference ajoute 4 Ko à cette valeur, mais l'utilisation de editor.clear (). Commit () ne réduit pas le nombre.
Code Commander
2
@rubdottocom Pourquoi ne mettez-vous pas votre commentaire comme réponse distincte?
technophyle
10
@rubdottocom mieux utiliser .apply () au lieu de .commit ()
Juan Aguilar Guisado
173

Ma solution:

SharedPreferences preferences = getSharedPreferences("Mypref", 0);
preferences.edit().remove("text").commit();
vaibhav vijay
la source
2
Cela supprime-t-il uniquement la variable TEXT?
Si8
3
@ SiKni8 Oui, cela supprime uniquement la paire clé / valeur avec clé "text".
Dennis
J'ai pu le faire fonctionner car ça fait longtemps mais merci pour la réponse :)
Si8
Vous avez sauvé ma santé mentale absolue. : P MERCI. J'essayais d'effacer les préférences pour un élément d'un objet à la fois, et cela fonctionne à merveille.
Azurespot
3
Pensez à utiliser apply () au lieu de commit () pour effectuer la tâche dans un thread d'arrière-plan.
Zon
124

Suppression de toutes les préférences:

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

Suppression d'une seule préférence:

SharedPreferences settings = context.getSharedPreferences("PreferencesName", Context.MODE_PRIVATE);
settings.edit().remove("KeyName").commit();
zserghei
la source
1
Quel sera le KeyName?
hasnain_ahmad
2
Comment supprimer l'intégralité du fichier de préférences, pas seulement les préférences à l'intérieur du fichier?
Srikar Reddy
Utilisez apply () au lieu de commit () pour effectuer la tâche dans un thread d'arrière-plan. commit () bloque et écrit les données sur le stockage instantanément. apply () est asynchrone.
Vaibhav
64

S'il n'est pas nécessaire d'être supprimé à chaque fois, vous pouvez le supprimer manuellement à partir de:

Paramètres -> Applications -> Gérer les applications -> (choisissez votre application) -> Effacer les données ou Désinstaller

Versions plus récentes d'Android:

Paramètres -> Applications -> (choisissez votre application) -> Stockage -> Effacer les données et vider le cache

Nobu
la source
5
pouvons-nous faire ces choses par programmation.
amity
@amity L'autre réponse le fait par programme.
Doomsknight
31
Merci pour une option non programmatique.
CorayThan
2
@amity - Certains d'entre nous avaient besoin de cette réponse. Je ne savais pas comment supprimer SharedPrefs sur un émulateur Android afin de pouvoir continuer à tester mon code.
TJ Biddle le
1
Pas là dans le studio Android 2.2.2 18/10/2016.
Robin comme l'oiseau
26

Suppression des préférences partagées Android sur une seule ligne :-)

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

Ou applypour un fonctionnement asynchrone non bloquant:

this.getSharedPreferences("YOUR_PREFS", 0).edit().clear().apply();
rubdottocom
la source
La meilleure solution pour moi. Il y a peu de cas où synchrone est nécessaire pour le contenu des préférences partagées.
Juan Aguilar Guisado
19

Semble que toutes les solutions ne fonctionnent pas complètement ou sont mortes

pour effacer toutes les préférences partagées d'une activité

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

Appelez cela depuis l'activité principale après onCreate

note * j'ai utilisé à la .apply()place de .commit(), vous êtes libre de choisir commit ();

Shady Keshk
la source
exactement ce que je veux. Merci, il efface toutes les préférences par défaut
Arpit Patel
11

Vous pouvez utiliser le shell adb pour le faire même sans téléphone rooté. Le seul hic, c'est que l'application doit être débogable.

run-as <your package name> <command>

Par exemple:

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

Alternativement, vous pouvez simplement faire ce qui précède mais sans la commande qui vous dirigera vers la racine du package d'application et vous permettra d'exécuter plus de commandes dans le contexte de l'application.

Johnson Wong
la source
1
+1 pour l'astuce utile run-as. On pourrait penser que j'aurais trouvé ça après 3 ans ...
Richard Le Mesurier
Ce ne sont pas les préférences partagées, c'est la base de données sqlite
OneCricketeer
10
Editor editor = getSharedPreferences("clear_cache", Context.MODE_PRIVATE).edit();
editor.clear();
editor.commit();
Vaishali Sutariya
la source
9

Depuis l'API 24 (Nougat), vous pouvez simplement faire:

context.deleteSharedPreferences("YOUR_PREFS");

Cependant, il n'y a pas de compatibilité descendante, donc si vous prenez en charge moins de 24, restez avec:

context.getSharedPreferences("YOUR_PREFS", Context.MODE_PRIVATE).edit().clear().apply(); 
afathman
la source
9

Tout effacer:

PreferenceManager.getDefaultSharedPreferences(context).edit().clear().apply()
Dan Alboteanu
la source
8

Vous pouvez également désinstaller manuellement votre application à l'aide de votre appareil. Ensuite, lorsque vous réinstallez votre application, les préférences partagées ont été réinitialisées.

wizurd
la source
Merci - je ne voulais pas supprimer par programme sharedPreferences donc cela a fonctionné pour moi.
Simon
Sur mon appareil, j'ai la possibilité de «supprimer les données» sur l'option de désinstallation, qui a fonctionné pour moi et a supprimé la nécessité de réinstaller mon application.
G O'Rilla
8

Dans les définitions de classe:

private static final String PREFERENCES = "shared_prefs";

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

À l'intérieur de la classe:

public static void deleteAllSharedPrefs(){
    sharedPreferences.edit().clear().commit();
}
sivi
la source
7

Essayez ce code:

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

Si c'est pour vos tests. Vous pouvez utiliser les commandes adb.

adb shell pm clear <package name>
Prakash
la source
5
String prefTag = "someTag";
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(applicationContext);
prefs.edit().remove(prefTag).commit();

Cela supprimera les préférences partagées enregistrées sous le nom "someTag".

Kiran kg
la source
3
  • Pour supprimer une valeur particulière,

SharedPreferences.Editor remove (String key) suivi d'un commit () ou d'un apply ()

  • Pour supprimer toutes les valeurs,

    SharedPreferences.Editor clear () suivi d'un commit () ou d'un apply ()

Palak Jain
la source
3

Pour supprimer les paires valeur / clé de préférence, vous pouvez facilement effectuer les opérations suivantes

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

J'ai également développé une bibliothèque pour une manipulation facile des préférences partagées. Vous pouvez trouver le lien suivant

https://github.com/farruhha/SimplePrefs

Farruh Habibullaev
la source
2

Pour effacer toutes les SharedPreferences de façon centralisée dans n'importe quelle classe:

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

Et puis à partir de n'importe quelle classe: (commit retourne un booléen où vous pouvez vérifier si vos préférences sont effacées ou non)

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

Ou vous pouvez utiliser appliquer; il retourne nul

Navigation.getEditor(this).clear().apply();
Soufiyan Ansari
la source
1
new File(context.getFilesDir(), fileName).delete();

Je peux supprimer le fichier dans les préférences partagées avec lui

Dũng Phạm Tiến
la source
Toutes les solutions ci-dessus sont fausses, seul le fichier de suppression est correct pour supprimer les préférences partagées
Dreamer
1

Aucune des réponses ne fonctionne pour moi car j'ai de nombreuses clés de préférences partagées.

Supposons que vous exécutez un test Android au lieu d'un test unitaire.

Il fonctionne pour moi, boucle et supprime tous les fichiers shared_prefs .

@BeforeClass s'exécutera avant tous les tests et 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();
    }
}
Allen
la source
0

La méthode Kotlin ktx pour effacer toutes les préférences:

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

Cliquez ici pour toutes les opérations de préférences partagées avec des exemples

Paritosh
la source
-2

Vous pouvez utiliser preferences.edit().remove("key").commit()pour supprimer les valeurs enregistrées des préférences partagées.

Ashish Jaiswal
la source
-6

Je viens de le faire ce matin. À partir d'une invite de commande:

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

REMARQUE : Cela nécessite un appareil enraciné tel que les appareils virtuels Android d'origine, un appareil Genymotion ou un combiné / tablette enraciné réel, etc.

kdahlhaus
la source
9
Quiconque a voté contre cette solution devrait peut-être aussi expliquer pourquoi: vous avez besoin d'un téléphone rooté pour accéder /data/datadirectement!
nuala
3
Vous devez supprimer les SharedPreferences de l'application et non le shell ADB. Cela se fait à l'aide de: SharedPreferences.edit (). Clear (). Commit ();
ThePunisher
On ne leur a jamais dit qu'ils voulaient une solution sans racine. Il y a cependant une erreur technique; car cette méthode nécessite root, vous devez exécuter suaprès adb shellpour ouvrir un shell privilégié.
Anubian Noob
Pourquoi cela a-t-il été autant rejeté? Ceci est une réponse utile et celle que je cherchais.
Matt D