sábado, 23 de maio de 2015

Carregando um banco de dados SQLite a partir de um arquivo CSV.

Em nosso primeiro artigo sobre banco de dados no Android, vimos como criar uma base de dados e inserimos alguns registros programaticamente. Mas no mundo real, ficaria inviável carregarmos uma grande massa de dados pelo método apresentado no tutorial.

Uma solução muito útil é obter os dados a partir de um arquivo texto, no formato CSV, ou seja, onde os campos são delimitados por vírgulas.

Para exemplificar, vamos, utilizando o "projetoBancoDeDados", criar um arquivo texto na pasta "assets", denominado "funcionarios.csv". O conteúdo do arquivo deve ser como o definido abaixo:

1,JOSÉ SILVA,Auxiliar administrativo,985.63
2,MARIA JOSÉ,Cozinheira,627.35
3,HENRIQUE ARIAS,Motorista,1239.56
4,ASTOLFO GOMES,Zelador,832.57
5,MARINA ZENAIDE,Gerente,5342.00
6,PEDRO TELEZ,Porteiro,854.34
7,AMÉRICO TOLEDO,Balconista,700.88
8,ANTONIO FARIA,Recepcionista,800.00
9,ANA JARDIM,Gerente,6543.36
10,MARCELE PEREIRA,Diretora,9834.23
11,DANIELE GOMEZ,Coordenadora,3454.67
12,AMANDA AGUIAR,Faxineira,643.36
13,ROBERTO DANTAS,Programador,2345.65
14,ANDERSON CLEITON,Analista de sistemas,4534.87
15,CLÉCIO GOMES,Instrutor,3234.88
 


A ideia é obter cada linha do arquivo CSV acima e extrair os campos um a um (id, nome, cargo e salário). E a partir daí gravar os dados no banco.

Para isto, vamos agora abrir nossa classe "MainActivity.java" e substituir seu conteúdo integralmente por:

package com.example.projetobancodedados;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.res.AssetManager;
import android.util.Log;

public class MainActivity extends Activity
{
     
   @Override
   protected void onCreate(Bundle savedInstanceState)
   {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      // Realiza uma carga inicial do banco de dados, à partir de um arquivo texto CSV.
      fazerCargaInicial(this);

      // Obtem lista de todos os funcionários da base.
      ArrayList<FuncionarioDTO> listaDeFuncionarios = new ArrayList<FuncionarioDTO>();
      FuncionarioDAO funcionarioDAO = new FuncionarioDAO(this);
      funcionarioDAO.open();
      listaDeFuncionarios=funcionarioDAO.getAll();
      funcionarioDAO.close();
     
      // Mostra no LogCat todos os funcionários da base.
      for(FuncionarioDTO f: listaDeFuncionarios)
      {
        
         Log.i("debug", f.getId() + "");
         Log.i("debug", f.getNome());
         Log.i("debug", f.getCargo());
         Log.i("debug", f.getSalario() + "");
        
      }
     
   }

   @Override
   protected void onResume()
   {
      super.onResume();
   }

   @Override
   protected void onPause()
   {
      super.onPause();
   }

  
   public void fazerCargaInicial(Context ctx)
   {
      // Obtém DAO do funcionário.
      FuncionarioDAO db = new FuncionarioDAO(ctx);
      db.open();

      try
      {
                 
         AssetManager assetManager= ctx.getAssets();
         InputStreamReader is=new InputStreamReader(assetManager.open("funcionarios.csv"), "ISO8859-1");
         BufferedReader reader=new BufferedReader(is);

         String linha;
         String id, nome, cargo, salario;

         while ((linha=reader.readLine()) != null)
         {
            String[] dadosDaLinha=linha.split(",");
            FuncionarioDTO funcionarioDTO = new FuncionarioDTO();
           
            funcionarioDTO.setId(Integer.parseInt(dadosDaLinha[0]));
            funcionarioDTO.setNome(dadosDaLinha[1]);
            funcionarioDTO.setCargo(dadosDaLinha[2]);
            funcionarioDTO.setSalario(Double.parseDouble(dadosDaLinha[3]));
           
            db.save(funcionarioDTO);
           
         }
         is.close();
      }
      catch (IOException ex)
      {
         Log.i("debug", "erro" + ex.getMessage() );
      }

      db.close();
     
   }

}


O pulo do gato aqui está no método "fazerCargaInicial()", que lê o arquivo CSV da pasta "Assets" e extrai os dados, gravando-os posteriormente na base. Simples.

Dica boa, hein? Gostou? Comente!

3 comentários:

  1. E como faria para ler todo um script SQL. ex:

    CREATE TABLE linguagens (
    id INT AUTO_INCREMENT,
    nome VARCHAR(100),
    descricao VARCHAR(200),
    primary key(id)
    );


    INSERT INTO linguagens VALUES(1, 'Ruby', 'Sobre a linguagem Ruby');
    INSERT INTO linguagens VALUES(2, 'Python', 'Sobre a linguagem Python');
    INSERT INTO linguagens VALUES(3, 'Perl', 'Sobre a linguagem Perl');

    ResponderExcluir
  2. Este comentário foi removido pelo autor.

    ResponderExcluir
  3. na verdade eu queria importar um arquivo Dump

    ResponderExcluir