Como excluir dados de preferências compartilhadas do App no ​​Android

478

Como excluo os dados de SharedPreferences do meu aplicativo?

Estou criando um aplicativo que usa muitos serviços da web para sincronizar dados. Para fins de teste, preciso eliminar alguns valores de SharedPreferences quando reiniciar o aplicativo.

Andrew
fonte

Respostas:

871

Para remover valores específicos: SharedPreferences.Editor.remove () seguido por umcommit()

Para removê-los todos SharedPreferences.Editor.clear()seguidos por umcommit()

Se você não se importa com o valor de retorno e o está usando no encadeamento principal do aplicativo, considere usá-lo apply().

Mark B
fonte
268
context.getSharedPreferences ("YOUR_PREFS", 0) .edit (). clear (). commit (); // remover todos os seus prefs :)
rubdottocom
2
@yoshi existe definitivamente um remove () e um clear (). Você usa remove () para remover preferências específicas, usa clear () para remover todas elas. A pergunta original não estava clara se eles precisavam removê-los todos ou não.
Mark B
9
Limpar o arquivo de preferências não parece realmente excluí-lo. Em meus próprios testes, observando o uso de "Dados" listado no painel Informações do aplicativo, a criação de um novo arquivo SharedPreference adiciona 4KB a esse valor, mas o uso de editor.clear (). Commit () não reduz o número.
Código Commander
2
@rubdottocom Por que você não coloca seu comentário como uma resposta separada?
24515
10
@rubdottocom melhor utilizando .Aplique () em vez de .commit ()
Juan Aguilar Guisado
173

Minha solução:

SharedPreferences preferences = getSharedPreferences("Mypref", 0);
preferences.edit().remove("text").commit();
vaibhav vijay
fonte
2
Isso remove apenas a variável TEXT?
Si8
3
@ SiKni8 Sim, isso remove apenas o par de chave / valor com a chave "text".
Dennis
Eu era capaz de fazê-lo funcionar porque já faz um tempo, mas obrigado pela resposta :)
Si8
Você salvou minha absoluta sanidade. : OBRIGADO. Eu estava tentando limpar as prefs para um elemento de um objeto de cada vez, e isso funciona muito bem.
Azurespot
3
Considere usar apply () em vez de commit () para executar a tarefa em um encadeamento em segundo plano.
Zon
124

Removendo todas as preferências:

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

Removendo a preferência única:

SharedPreferences settings = context.getSharedPreferences("PreferencesName", Context.MODE_PRIVATE);
settings.edit().remove("KeyName").commit();
zserghei
fonte
1
Qual será o KeyName?
hasnain_ahmad
2
Como excluir o arquivo de preferências inteiro, não apenas as preferências dentro do arquivo?
Srikar Reddy
Use apply () em vez de commit () para executar a tarefa em um encadeamento em segundo plano. commit () bloqueia e grava dados no armazenamento instantaneamente. apply () é assíncrono.
Vaibhav
64

Se não for necessário remover sempre, você pode removê-lo manualmente de:

Configurações -> Aplicativos -> Gerenciar aplicativos -> (escolha seu aplicativo) -> Limpar dados ou Desinstalar

Versões mais recentes do Android:

Configurações -> Aplicativos -> (escolha seu aplicativo) -> Armazenamento -> Limpar dados e Limpar cache

Nobu
fonte
5
podemos fazer isso programático?
amizade
@amity A outra resposta faz isso de forma programática.
Doomsknight
31
Obrigado por uma opção não programática.
CorayThan
2
@amity - Alguns de nós precisavam desta resposta. Não sabia ao certo como remover o SharedPrefs em um emulador do Android para continuar testando meu código.
TJ Biddle
1
Não existe no android studio 2.2.2 18/10/2016.
Robin como o pássaro
26

Excluindo as preferências compartilhadas do Android em uma linha :-)

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

Ou applypara operação assíncrona sem bloqueio:

this.getSharedPreferences("YOUR_PREFS", 0).edit().clear().apply();
rubdottocom
fonte
Melhor solução para mim. Existem poucos casos em que o síncrono é necessário para o conteúdo de preferências compartilhadas.
Juan Aguilar Guisado
19

Parece que toda solução não está completamente funcionando ou morta

limpar todas as Preferências Compartilhadas em uma Atividade

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

Chame isso da Atividade principal após onCreate

note * eu usei em .apply()vez de .commit(), você é livre para escolher commit ();

Shady Keshk
fonte
exatamente o que eu quero. Obrigado, limpa todas as preferências padrão
Arpit Patel 29/03
11

Você pode usar o shell adb para fazer isso mesmo sem um telefone root. O único problema é que o aplicativo deve ser depurável.

run-as <your package name> <command>

Por exemplo:

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

Como alternativa, você pode fazer o acima, mas sem o comando que o direcionará para a raiz do pacote de aplicativos e permitirá que você execute mais comandos no contexto do aplicativo.

Johnson Wong
fonte
1
+1 para obter uma dica útil run-as. Você pensaria que eu teria encontrado isso depois de 3 anos ...
Richard Le Mesurier
Esta não é a SharedPreferences, é o banco de dados SQLite
OneCricketeer
10
Editor editor = getSharedPreferences("clear_cache", Context.MODE_PRIVATE).edit();
editor.clear();
editor.commit();
Vaishali Sutariya
fonte
9

A partir da API 24 (Nougat), você pode:

context.deleteSharedPreferences("YOUR_PREFS");

No entanto, não há compatibilidade com versões anteriores; portanto, se você estiver suportando algo menor que 24, fique com:

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

Limpe todos eles:

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

Você também pode desinstalar manualmente seu aplicativo usando seu dispositivo. Então, quando você reinstalar o aplicativo, as preferências compartilhadas foram redefinidas.

feiticeiro
fonte
Obrigado - eu não queria remover programaticamente sharedPreferences, então isso funcionou para mim.
616 Simon
No meu dispositivo, tenho a opção de "limpar dados" na opção de desinstalação, que funcionou para mim e removeu a necessidade de reinstalar meu aplicativo.
G O'Rilla
8

Nas definições de classe:

private static final String PREFERENCES = "shared_prefs";

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

Dentro da turma:

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

Tente este código:

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

Se é para o seu teste. Você pode usar comandos adb.

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

Isso excluirá as preferências compartilhadas salvas com o nome "someTag".

Kiran kg
fonte
3
  • Para remover um valor específico,

SharedPreferences.Editor remove (chave String) seguido por um commit () ou um apply ()

  • Para remover todos os valores,

    SharedPreferences.Editor clear () seguido por um commit () ou um apply ()

Palak Jain
fonte
3

Para remover os pares de valores-chave da preferência, você pode facilmente fazer o seguinte

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

Também desenvolvi uma biblioteca para facilitar a manipulação de preferências compartilhadas. Você pode encontrar o seguinte link

https://github.com/farruhha/SimplePrefs

Farruh Habibullaev
fonte
2

Para limpar todas as SharedPreferences centralmente de qualquer classe:

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

E então de qualquer classe: (commit retorna um Booleano onde você pode verificar se suas Preferências foram limpas ou não)

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

Ou você pode usar aplicar; retorna nulo

Navigation.getEditor(this).clear().apply();
Sufiyan Ansari
fonte
1
new File(context.getFilesDir(), fileName).delete();

Eu posso excluir o arquivo em preferências compartilhadas com ele

Dũng Phạm Tiến
fonte
Todas as soluções acima estão erradas, apenas excluir o arquivo é o correto para excluir preferências compartilhadas
Dreamer
1

Nenhuma das respostas funciona para mim, pois tenho muitas chaves de preferências compartilhadas.

Digamos que você esteja executando um Teste do Android em vez de um teste de unidade.

Está funcionando para mim fazer loop e excluir através de todos os arquivos shared_prefs .

@BeforeClass será executado antes de todos os testes 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();
    }
}
Allen
fonte
0

A maneira Kotlin ktx de limpar todas as preferências:

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

Clique aqui para todas as operações de preferências compartilhadas com exemplos

Paritosh
fonte
-2

Você pode usar preferences.edit().remove("key").commit()para excluir valores salvos das preferências compartilhadas.

Ashish Jaiswal
fonte
-6

Só fiz isso esta manhã. Em um prompt de comando:

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

OBSERVAÇÃO : isso requer um dispositivo raiz, como os dispositivos virtuais Android padrão, um dispositivo Genymotion ou um aparelho / tablet com raiz real etc.

kdahlhaus
fonte
9
Portanto, quem votou nessa solução talvez também explique o motivo: Você precisa de um telefone raiz para acessar /data/datadiretamente!
nuala 15/05
3
Você precisa remover o SharedPreferences do aplicativo e não o ADB Shell. Isso é feito usando: SharedPreferences.edit (). Clear (). Commit ();
ThePunisher
Perguntado nunca disse que queria uma solução sem raiz. Há um erro técnico aqui; porque esse método requer raiz, você deve executar sudepois adb shellpara abrir um shell privilegiado.
Anubian Noob
Por que isso foi tão prejudicado? Esta é uma resposta útil e a que eu estava procurando.
Matt D