Prós e contras das preferências compartilhadas e do SQLite [fechado]

156

Qual é o bom mecanismo para armazenar informações entre o banco de dados SQLite e as Preferências Compartilhadas?

Por que usar preferências compartilhadas? Por que usar o sqlite? Tentei encontrar a diferença entre eles e qual é o melhor mecanismo para armazenamento de dados, mas não consigo encontrar a resposta apropriada no Google. Por favor me ajude com exemplos e explicações.

Rana.S
fonte
Depende do tipo de dados que você deseja armazenar. O SharedPreferences permite um acesso mais rápido e simples aos dados; é mais confortável de usar ao manter pequenas quantidades de dados.
Egor
2
Não armazene nada nas Preferências compartilhadas, exceto cadeias simples e primitivas - e se você usar um arquivo separado para cada uma - apesar dos documentos, as Preferências compartilhadas não são seguras contra threads e, mesmo se usadas somente no segmento principal, são propensas a corrupção, caso você armazene mais de 1 par de valores-chave em um arquivo.
RunLoop
As SharedPreferences são armazenadas em cache na memória após o primeiro uso, portanto devem ser bem rápidas nos usos de leitura consequentes.
295 Stan Stan

Respostas:

169

Realmente depende dos dados que você deseja armazenar.

SQLite

Grandes quantidades dos mesmos dados estruturados devem ser armazenados em um banco de dados SQLite, pois os bancos de dados são projetados para esse tipo de dados. Como os dados são estruturados e gerenciados pelo banco de dados, eles podem ser consultados para obter um subconjunto dos dados que corresponda a determinados critérios usando uma linguagem de consulta como SQL. Isso torna possível pesquisar nos dados. É claro que gerenciar e pesquisar grandes conjuntos de dados influencia o desempenho, portanto, a leitura de dados de um banco de dados pode ser mais lenta do que a leitura de dados de Preferências Compartilhadas.

Preferências Compartilhadas

SharedPreferences é um armazenamento de chave / valor em que você pode salvar dados sob determinada chave. Para ler os dados da loja, você precisa conhecer a chave dos dados. Isso facilita a leitura dos dados. Mas, por mais fácil que seja armazenar uma pequena quantidade de dados, é difícil armazenar e ler grandes dados estruturados, pois você precisa definir a chave para cada dado, além disso, você não pode realmente pesquisar nos dados, a menos que tenha um certo conceito para nomeando as chaves.

Flo
fonte
24
Para dar um exemplo, as SharedPreferences são úteis para armazenar as preferências do usuário, onde há apenas algumas variáveis ​​que precisam ser armazenadas. Por outro lado, o SQLite seria melhor para armazenar dados onde há um grande conjunto de itens, como títulos de músicas em uma biblioteca de músicas que precisam ser pesquisados.
CL22 8/08
5
Você não precisa saber os nomes das chaves para usar SharedPreferences. Veja getAll ().
ZaBlanc
5
Para sua informação, existe uma TERCEIRA opção: ler / gravar XML em um arquivo. (Veja as classes android.util.xml). Apropriado para dados moderadamente complexos que podem ser lidos / gravados de uma só vez. Por exemplo, uma grade de valores que o usuário não altera com frequência. Especialmente se forem dados que você possa enviar posteriormente para outro lugar, será necessário em um formato analisável.
Home
1
é aconselhável salvar um json como string json em pref compartilhado?
Kaveesh Kanwal
2
@JCarlos Enquanto você não estiver fazendo algumas coisas entre processos, você estará bem usando SharedPreferences.
Mygod
97

Esta pergunta tem uma resposta aceita, mas acho que há mais a ser dito sobre o assunto - em relação à velocidade.

As SharedPreferences de um aplicativo e o Sqlite DB são apenas arquivos, armazenados nos diretórios do aplicativo no sistema de arquivos do dispositivo. Se a quantidade de dados não for muito grande, a opção Sqlite envolverá um arquivo maior e mais complicado, com mais sobrecarga de processamento para acesso simples.

Portanto, se a natureza dos dados não ditar sua escolha (como explicado na resposta aceita) e a velocidade for importante, provavelmente será melhor usar SharedPreferences.

E a leitura de alguns dados geralmente está no caminho crítico para a exibição da atividade principal, então acho que a velocidade geralmente é muito importante.

Um pensamento final sobre velocidade e eficiência - se você precisar usar um banco de dados Sqlite para alguns dados estruturados, provavelmente será mais eficiente também armazenar as preferências do usuário no banco de dados para não abrir um segundo arquivo. Essa é uma consideração bastante pequena - provavelmente vale a pena considerar apenas se você precisar acessar os dados estruturados e as preferências antes de poder exibir a atividade principal.

Tom
fonte
6
E a legibilidade do código? Eu acho que ao armazenar vários registros em SharedPrefs em vez de uma tabela db, o código fica complicado. Sintaxe SQL é mais fácil de ler do que looping sobre entradas SharedPrefs ...
IgorGanapolsky
8
Igor, eu discordo. As SharedPreferences são realmente unidimensionais, é muito simples usar uma preferência. Por exemplo, estou criando um aplicativo de verificação de estoque, estou simplesmente armazenando os símbolos de ações nas preferências. Não preciso agarrá-los individualmente, pois sempre listo todos eles, e é tudo o que faço, armazeno ou agarro. É tão simples, muito mais simples do que usar um banco de dados.
AutoM8R
1
Não consigo pensar em uma situação em que a legibilidade do código seja difícil, enquanto a estrutura dos dados a serem salvos não exija o uso de um banco de dados hierárquico. Mesmo se houver algum problema de legibilidade, ele pode ser resolvido usando uma classe de wrapper com as funções necessárias.
Sarath Sadasivan Pillai
1
Podemos armazenar vários valores-chave na forma de dados jsonstring em preferências compartilhadas? Existe um limite de caracteres que pode truncar meus valores json?
Nova
2
As SharedPreferences são carregadas na memória apenas uma vez (por ciclo de vida do processo do aplicativo) e mantidas lá; depois disso é sempre super rápido. Portanto, não há realmente nenhum ganho prático de desempenho colocando dados do SharedPref no SQLite (apenas para evitar o acesso extra ao arquivo SharedPref). E, a propósito, você não deve colocar seu material SQLite nos SharedPrefs; como eu disse, está sempre na memória, o que pode causar problemas (problemas de falta de memória).
Zsolt Safrany
20

Minha opinião é que não se trata de velocidade ou tamanho, mas do tipo de operação que você deseja executar nos seus dados.

Se você pretende fazer juntar-se , tipo , e outras operações de banco de dados sobre seus dados, em seguida, ir para SQLite . Um exemplo é a classificação de dados por data.

Se você deseja mapear valores simples (como int, booleano, String), use Preferências . As operações de banco de dados não funcionarão aqui e é desnecessário dizer que você precisa ter todas as chaves. Um exemplo é a senha do usuário ou a configuração do aplicativo.

A grande tentação de adotar as Preferências é quando você deseja usá-lo para armazenar um POJO achatado (um objeto JSON serializado) como String. Ter essa necessidade é realmente o sinal para usar o Sqlite. Por quê ? Porque dados complexos eventualmente precisarão de operações complexas. Imagine recuperar uma entrada específica que poderia ser manipulada por um simples "SELECT ... WHERE id = 1". No caminho Preferências, esse será um processo longo, desde a desserialização até a iteração dos resultados.

inmyth
fonte
Além disso, SharedPreferences não suporta transações, portanto, se você precisar de transações, use o SQLite. Por exemplo, se o usuário pressionar um botão "sair", convém limpar várias SharedPreferenceschaves / valores de uma só vez (por exemplo, as teclas usere password), para ter certeza de que ambas as teclas estão desmarcadas ou estão definidas.
runeks
5
  • Para armazenar uma grande quantidade de dados, vá para o sistema de banco de dados SQLite. Isso permitirá que o usuário procure dados também.

  • Por outro lado, para armazenar uma pequena quantidade de dados, vá para Preferências compartilhadas. Nesse caso, um enorme sistema de banco de dados é desnecessário. Isso permitirá que o usuário salve os dados e carregue-os.

Sami Al-Jabar
fonte
1
300 pares de valores-chave é uma enorme quantidade de dados? Eu preciso guardar exatamente.
JCarlosR
1
Nesse caso, você deve ir para o banco de dados SQLite. Caso contrário, será difícil gerenciar e recuperar esses 300 dados.
Sami Al-Jabar
Mas se todas as chaves forem conhecidas, não será mais fácil buscar os dados nas Preferências compartilhadas?
Arjun
-6

Esqueça o SQLLite, esqueça as SharedPreferences, use Realm. Uma solução única para todo o seu armazenamento local. Você pode usar objetos Java antigos simples como RealmObjects e armazenar seus dados lá. Você pode converter consultas selecionadas em arquivos JSON. Não há necessidade de analisar toda a base de dados. Verifique este link: https://realm.io/news/introducing-realm/

greenspand
fonte
12
esqueça tudo o que você sabe sobre coberturas.
Andrew G