sexta-feira, 22 de maio de 2015

Como fazer o banco de dados residir no SDCARD do Android.

Alô pessoal! Estive um pouco ocupado nos últimos dias e por isso não tive tempo para escrever no blog. No entanto, trago hoje um assunto deveras interessante e útil:

Como fazer o banco de dados de nosso app residir no SDCARD, isto é, na memória externa do dispositivo.

A primeira pergunta é: por quê?

A resposta é simples: O Android possui uma memória interna, inerente ao aparelho, e, opcionalmente, uma memória externa, provida através da adição de um cartão extra, conhecido como SDCARD.

Ocorre que, via de regra, a memória interna é menor do que a externa. Principalmente nos aparelhos mais antigos, onde ela pode ser de alguns poucos megabytes. Quando muito 1 ou 2 gigas.

Certamente o leitor em algum momento já se deparou com a mensagem de erro "Internal memory full" ou "Database Storage full", ou algo similar, na tela de seu Android. Isso acontece porque a grande maioria dos aplicativos usa a localização padrão para criar seus bancos de dados: a pasta "/data/data/nomeDoApp". Afinal, se não informarmos nada na classe SQLiteHelper, ela criará o banco nesse local.

Pois bem, é uma prática inteligente priorizarmos o SDCARD como local de criação do banco de dados de nosso app, tomando o cuidado, é claro, de verificarmos primeiro se ele está presente.

Isto é feito da seguinte forma:

import android.os.Environment;
// Verifica se existe SDCARD montado no sistema.
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
   // Realiza alguma operação em caso afirmativo.
}

Agora que já sabemos como verificar se há SDCARD instalado no sistema, vamos modificar nosso projetoBancoDeDados para que os construtores das classes que criam nosso banco façam esta checagem e, no caso da existência do SDCARD, gravar o banco de dados nele.

Primeiro vamos alterar o construtor da classe "FuncionarioDAO", para que fique assim:

  public FuncionarioDAO(Context context)
   {
      String path="";
      String FILE_DIR="projetoBancoDeDados";

      // Se houver SDCARD montado, então cria a base no SDCARD. Caso contrário,
      // na memória interna.
      if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
      {
         path=Environment.getExternalStorageDirectory().toString() + File.separator + FILE_DIR + File.separator;
      }
     
      dbHelper=new MySQLiteHelper(context, path);
   }

Como estamos agora passando mais um parâmetro para o construtor da classe "mySQLiteHelper", ou seja, além do contexto, estamos também passando o caminho onde o banco deve ser criado (path) então temos que mudar o construtor desta última classe também:

   public MySQLiteHelper(Context context, String path)
   {
      super(context, path + DATABASE_NAME, null, DATABASE_VERSION);
   } 

A mudança é bastante simples. Só estamos acrescentando o caminho, informando assim, onde o banco deve ser criado.

Precisaremos também, informar no arquivo "AndroidManifest.xml" que utilizaremos a permissão de escrita no armazenamento externo:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />



Executando novamente o código será possível notar que o banco agora está residindo na pasta "/mnt/sdcard/projetoBancoDeDados". E economizando um bocado de memória interna!

That´s it. Stay tuned!

Nenhum comentário:

Postar um comentário