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.

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.


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();

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();

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


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();

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 ();


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.


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();

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(); 

9

Tout effacer:

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

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.


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

7

Essayez ce code:

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

5

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

adb shell pm clear <package name>

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".


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 ()


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


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();

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

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


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

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


-2

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


-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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.