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.

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


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

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

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


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

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


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.


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

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

9

Limpe todos eles:

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

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.


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

7

Tente este código:

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

5

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

adb shell pm clear <package name>

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


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


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


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

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

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


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

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


-2

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


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.