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