Android – Opções de Armazenamento (persistência de dados)

Opções de Armazenamento

“Android fornece várias opções para você salvar os dados de aplicativos persistentes. A solução que você escolher depende das suas necessidades específicas, como se os dados devem ser privados de sua aplicação ou acessíveis a outras aplicações (e do usuário) e quanto espaço os seus dados requer.”

Vou mostrar as seguintes formas de armazenamento neste post:

SharedPreferences

Armazenar dados particulares primitivos em pares chave-valor.

Internal Storage

Armazenar dados privados na memória do dispositivo. ( com persistência de objetos )

External Storage

Armazenar dados públicos sobre o armazenamento externo compartilhado.

SQLite Databases

Armazenar dados estruturados em um banco de dados privado.

Usando o SharedPreferences

A classe SharedPreferences fornece um quadro geral que permite salvar e recuperar pares chave-valor de tipos de dados primitivos. Você pode usar o SharedPreferences para salvar os dados primitivos: booleans, floats, ints, longs, e strings. Estes dados irão persistir na sessões do usuário (mesmo que sua aplicação seja morta).

Para obter uma objeto SharedPreferences para sua aplicação, utilize um dos dois métodos:

  • getSharedPreferences() – Use esta se você precisar de vários arquivos de preferências identificadas pelo nome, que você especificar com o primeiro parâmetro.
  • getPreferences() – Use isto se você só precisa de um arquivo de preferências para a sua atividade. Porque este será o arquivo de preferências somente para sua atividade, você não fornecerá um nome.

Para escrever valores:

  1. Chame o método edit() para obter uma SharedPreferences.Editor .
  2. Adicionar valores com métodos tais como putBoolean() e putString().
  3. Persistir os novos valores com commit()

Para ler os valores, use SharedPreferences métodos como getBoolean() e getString() .

Aqui está um exemplo que salva uma preferência para o modo silencioso keypress em uma calculadora:

public class Calc extends Activity {
    public static final String PREFS_NAME = "MyPrefsFile";

    @Override
    protected void onCreate(Bundle state){
       super.onCreate(state);
       . . .

       // Restaurando as preferencias
       SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
       boolean silent = settings.getBoolean("silentMode", false);
       setSilent(silent);
    }

    @Override
    protected void onStop(){
       super.onStop();

       // Precisamos de um objeto Editor para fazer mudanças de preferência.
       // Todos os objetos são de android.context.Context
      SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
      SharedPreferences.Editor editor = settings.edit();
      editor.putBoolean("silentMode", mSilentMode);

      // Commit as edições
      editor.commit();
    }
}

Usando o Armazenamento Interno

Você pode salvar arquivos diretamente na memória interna do aparelho. Por padrão, os arquivos salvos para o armazenamento interno são privados de sua aplicação e outros aplicativos não possam acessá-los. Quando o usuário desinstala o aplicativo, esses arquivos são removidos.

Para criar e gravar um arquivo privado para o armazenamento interno:

  1. Chamar openFileOutput() com o nome do ficheiro e do modo de funcionamento. Isso retorna um FileOutputStream .
  2. Escreva para o arquivo com o write() .
  3. Fechar o fluxo com close() .

Por exemplo:

String FILENAME = "hello_file";
String string = "hello world!";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();

Armazenando objetos Serializaveis

  1. Chamar getFileStreamPath() com o nome do ficheiro e do modo de funcionamento. Isso retorna um File .
  2. Crie um FileOutputStream atravez do seu File
  3. Crie um ObjectOutputStream atravéz de seu FileOutputStream
  4. Grave o objeto com writeObject() de seu ObjectOutputStream.

*Lembre-se que seu objeto deve implementar java.io.Serializable

Exemplo:

//Para Gravar
String FILENAME = "hello_file";
File file =getFileStreamPath(FILENAME);

FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(objeto);
oos.close();
fos.close();

//Para Ler
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Object retorno = ois.readObject();
fis.close();
ois.close();

Usando armazenamento externo

Cada dispositivo compatível com Android suporta uma “memória externa” compartilhada que você pode usar para salvar arquivos. Isso pode ser uma mídia de armazenamento removível (como um cartão SD) ou uma memória interna (não removível). Os arquivos salvos para o armazenamento externo são de leitura para todos e pode ser modificado pelo usuário quando permitem armazenamento em massa USB para transferir arquivos de um computador.

Atenção: Os arquivos externos podem desaparecer se o usuário monta o armazenamento externo em um computador ou remove os meios de comunicação, e não há segurança aplicada sobre os arquivos que você salvar para o armazenamento externo. Todas as aplicações podem ler e gravar arquivos colocados no armazenamento externo e o usuário pode removê-los.

Verificar disponibilidade mídia

Antes de fazer qualquer trabalho com o armazenamento externo, você deve sempre chamar Environment.getExternalStorageState() para verificar se a mídia está disponível. A mídia pode ser montada a um computador, faltando, somente leitura, ou em algum outro estado. Por exemplo, aqui está como você pode verificar a disponibilidade:

boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) {
    // Podemos ler e escrever os meios de comunicação
    mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
    // Só podemos ler a mídia
    mExternalStorageAvailable = true;
    mExternalStorageWriteable = false;
} else {
     // Outra coisa que está errada.  Pode ser um de muitos outros estados, mas tudo o que precisamos
     // Para saber é que não sabem ler nem escrever
    mExternalStorageAvailable = mExternalStorageWriteable = false;
}

Acessar arquivos em armazenamento externo

Se você estiver usando API Level 8 ou superior, use getExternalFilesDir() para abrir um File que representa o diretório de armazenamento externo onde você deve salvar seus arquivos. Este método utiliza um type parâmetro que especifica o tipo de subdiretório que você deseja, como Environment.DIRECTORY_MUSIC e Environment.DIRECTORY_RINGTONES (null para receber a raiz do diretório do seu aplicativo). Este método irá criar o diretório apropriado, se necessário. Ao especificar o tipo de diretório, você garante que o scanner do Android mídia será devidamente categorizar seus arquivos no sistema (por exemplo, ringtones são identificados como ringtones e não de música). Se o usuário desinstala o aplicativo, este diretório e todo seu conteúdo será apagado.

Se você estiver usando API Nível 7 ou inferior, use Environment.getExternalStorageDirectory() , para abrir um File que representa a raiz do armazenamento externo. Você deve escrever os seus dados no seguinte diretório:
/Android/dados/<nome_do_pacote>/files/

Salvamento de arquivos que devem ser compartilhadas

Se você deseja salvar os arquivos que não são específicos para sua aplicação e que não devem ser excluídos quando o aplicativo é desinstalado, salvá-los em uma das listas públicas sobre o armazenamento externo. Esses diretórios devem ficar  na raiz do armazenamento externo, como Music/ , Pictures/ , Ringtones/ , e outros.

Na API Nível 8 ou superior, use Environment.getExternalStoragePublicDirectory() , passando o tipo de diretório público que você quer, como Environment.DIRECTORY_MUSIC e Environment.DIRECTORY_RINGTONES , ou outros. Este método irá criar o diretório apropriado, se necessário.

Se você estiver usando API Nível 7 ou inferior, use Environment.getExternalStorageDirectory() para abrir um File que representa a raiz do armazenamento externo, em seguida, salvar seus arquivos compartilhados em um dos seguintes diretórios:

  • Music/ – scanner de mídia classifica todas as mídias encontradas aqui, como a música do usuário.
  • Podcasts/ – Scanner de mídia classifica todas as mídias encontradas aqui, como um podcast.
  • Ringtones/ – Scanner de mídia classifica todas as mídias encontradas aqui, como um ringtone.
  • Alarms/ – Mídia leitor classifica todos os meios encontrados aqui, como um som de alarme.
  • Notifications/- Scanner de mídia classifica todas as mídias encontradas aqui, como um som de notificação.
  • Pictures/ – Todas as fotos (excluindo as tiradas com a câmara).
  • Movies/ – Todos os filmes (excluindo as medidas tomadas com a câmara de vídeo).
  • Download/ – downloads diversos.

O método de gravação é similar aos exemplos já mostrados usando FileOutputStream e Input para ler.

Usando Banco de Dados

Android oferece suporte completo para SQLite bancos de dados. Qualquer banco de dados que você criar poderá ser acessado pelo nome de qualquer classe na aplicação, mas não fora do aplicativo.

O método recomendado para criar um banco de dados SQLite novo é criar uma subclasse de SQLiteOpenHelper e substituir o método onCreate() , no qual você pode executar um comando SQLite para criar tabelas no banco de dados.

Para mais informações criei um topico bem mais especifico:
https://helpdev.com.br/2012/05/15/banco-de-dados-para-android/

 

FONTE: http://goo.gl/4l4C6

Help DEV – Analista desenvolvedor Java / Android
https://helpdev.com.br/zarelli

Android – Opções de Armazenamento (persistência de dados)

6 pensou em “Android – Opções de Armazenamento (persistência de dados)

  1. Estou realizando o armazenamento externo de um arquivo texto no meu Moto X, porém, o arquivo só aparece quando eu desligo e ligo o aparelho novamente. Poderia me ajudar com este problema?

  2. Olá!

    Gostaria de saber quem tem o melhor desempenho na aplicação (arquivos ou banco de dados) ?
    Me refiro ao receber dados de um servidor por json, Gostaria de saber se é melhor armazenar os valores do json em arquivos separados ou em um banco, por questões de desempenho.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Rolar para o topo