terça-feira, 19 de junho de 2012

Android - Uma abordagem sobre persistência de dados no SQLite - Parte 1



Olá amigos do The Club, tivemos outros artigos relacionados a persistência de dados em banco no Sistema Android. Neste artigo vou procurar detalhar um pouco mais dos recursos utilizados nos artigos anteriores e conhecer outros para se trabalhar com Banco de Dados. Estas informações se tornam primordiais para quem está começando a aprender este tipo de linguagem de programação. Continuaremos trabalhando com o SQLite, lembrando que o mesmo é responsável por persistir os dados no Banco. O foco deste artigo é permitir que os senhores montem uma tela simples de cadastro e outra de consulta persistindo e trabalhando com os dados.

Criando um novo Projeto

Seguindo os mesmos passos dos artigos anteriores para criar um novo projeto é bem simples, clique em File/New/Project Android e configure as propriedades da seguinte maneira:

Nome do Projeto: Android_BancoDados
Versão: Android 2.2
Aplicação: Android_BancoDados
Nome Pacote: pct. Android_BancoDados
Atividade: Android_BancoDadosActivity
Versão SDK: 8

A configuração deverá ficar idêntica a Imagem 01.


Figura 01: Configurações Iniciais.


Para finalizar esta etapa clique em “Finish”.

Importando as telas

O passo seguinte seria aproveitarmos as telas e boa parte da codificação do artigo “Navegando entre Telas” do Mês de Março de 2012. A diferença é que estaremos persistindo os dados no Banco de Dados, ao invés de salvar na memória em uma classe. Ver Imagem 02.
Figura 02: Telas importadas do artigo do mês de Março.

A Tela de Consulta possuirá mais dois botões para navegação entre os registros. Ver Imagem 03 e em seguida o código XML correspondente.

Figura 03: Tela de Consulta.


<LinearLayout
android:layout_width="match_parent" android:id="@+id/linearLayout5" android:layout_height="67dp">
<Button android:text=" Anterior" android:id="@+id/btAnterior" android:layout_height="wrap_content" android:layout_width="160dp"></Button>
<Button android:text="Posterior " android:id="@+id/btPosterior"
android:layout_width="160dp" android:layout_height="wrap_content"></Button>
</LinearLayout>


Implementando o método para inicializar os componentes

Achei interessante e prático criar um método para iniciar os objetos utilizados ao longo no desenvolvimento. São as mesmas variáveis utilizadas anteriormente, por isto não entrarei em detalhes.

public void InicializaObjetos()
{
     //Variáveis utilizadas no Cadastro
     rgCursos = (RadioGroup) findViewById(R.id.rgCursos);
rbLiteDelphi = (RadioButton) findViewById(R.id.rbLiteDelphi);
     rbLiteC = (RadioButton) findViewById(R.id.rbLiteC);
rbProfessional = (RadioButton) findViewById(R.id.rbProfessional);
rbStudent = (RadioButton) findViewById(R.id.rbStudent);
     txtCliente = (EditText) findViewById(R.id.edtCliente);
     txtCidade = (EditText) findViewById(R.id.edtCidade);
     spEstado = (Spinner) findViewById(R.id.spnEstado);
      
     //Variáveis utilizadas na Consulta      
     txtCli = (TextView) findViewById(R.id.lbCliente);
     txtCid = (TextView) findViewById(R.id.lbCidade);
     txtEst = (TextView) findViewById(R.id.lbEstado);
     txtCur = (TextView) findViewById(R.id.lbProduto);
     txtCod = (TextView) findViewById(R.id.lbCodigo);
}

Implementando o método para Abrir ou Criar o Banco de Dados

Para darmos continuidade ao artigo abra nossa “Activity” em “Android_BancoDados\src\pct.Android_BancoDados\Android_BancoDadosActivity.java”.
Importaremos duas classes responsáveis pela manipulação de dados, sendo:

Import android.database.sqlite.SQLiteDatabase: Seria o Banco de Dados propriamente dito, ou seja, responsável por armazenar as informações.

Import android.database.Cursor: Esta classe é responsável por manipular, navegar entre os registros do Banco de Dados.
Logo em seguida criaremos os objetos dentro da Activity.

SQLiteDatabase BancoDados = null;
Cursor cursor;

Devemos também criar um método responsável por abrir ou criar o Banco de Dados.


public void AbreouCriaBancoDados()
{
    try      
    {
BancoDados = openOrCreateDatabase("DBTHECLUB",        MODE_WORLD_READABLE, null);
String sql = "CREATE TABLE IF NOT EXISTS TB_THECLUB"
         +"(COD_CLI INTEGER PRIMARY KEY, " +
"NOM_CLI TEXT, END_CLI TEXT, TEL_CLI TEXT,  PRO_CLI TEXT)";
        
BancoDados.execSQL(sql);
Mensagem("Mensagem", "Banco Criado com Sucesso!");
    }
    catch (Exception e)
    {
Mensagem("Mensagem", "Erro ao criar ou abrir o Banco de Dados!");
      }
   
}

public void Mensagem(String Titulo, String Mensagem)
{
AlertDialog.Builder infoResultado = new      AlertDialog.Builder(Android_BancoDadosActivity.this);
     infoResultado.setTitle(Titulo);
     infoResultado.setMessage(Mensagem);
     infoResultado.setNeutralButton("Ok",null);
     infoResultado.show();
}


Iniciamos o método com um try/catch para validar a criação ou abertura do BD. Usaremos o método “OpenOrCreateDatabase” para criar o Banco de Dados contendo os seguintes parâmetros:


Tipo
Parâmetro
Descrição
Name
“DBTHECLUB”
Nome para o Banco de Dados.
Mode
MODE_WORD_READABLE
Significa que todas as aplicações poderão ler e acessar o arquivo.
Factory
null
Recurso não utilizado no momento.

A próxima etapa nós escrevemos a instrução SQL para criar a tabela de TB_THECLUB caso já não exista em nosso Banco de Dados. O comando BancoDados.execSql(sql) é responsável por esta tarefa. Utilizamos um método já abordado em outros artigos para podermos exibir uma mensagem informativa ao usuário, obtendo ou não sucesso na criação ou abertura de nosso Banco de Dados SQLite.

Implementando o método para Buscar os dados

Este método irá realizar a consulta SQL no SQLite retornando os dados para o Cursor.

public void BuscarDados()
{
    try
    {
      cursor = BancoDados.query("TB_THECLUB",
new string[]        {"NOM_CLI","CID_CLI","EST_CLI","PRO_CLI"},
                           null,
                           null,
                           null,
                           null,
                           null);
        
         if (cursor.getCount()!= 0 )
         {
              cursor.moveToFirst();
         }
    }
    catch (Exception e)
    {
MensagemAlerta("Mensagem", "Erro ao buscar dados no Banco de Dados!");
    }
}

   
Iniciamos o método com um try/catch para validar a obtenção dos dados usando o método “Query”. Neste caso atribuímos nossa consulta ao “Cursor” instanciado no início do artigo. Explicarei todos os argumentos na tabela a seguir.
Argumentos do Método BancoDados.query()

Tipo
Parâmetro
Descrição
Table
“TB_THECLUB”
Nome da tabela utilizada.
Columns
new String []{"NOM_CLI","CID_CLI","EST_CLI","PRO_CLI"}
Um vetor contendo todos os campos utilizados.
Selection
Null
Cláusula Where
SelectionArgs
Null
Argumento da cláusula Where.
GroupBy
Null
Argumento para agrupar os registros.
Having
Null
Argumento para restringir a quantidade de registros.
OrderBy
Null
Argumento para Ordenação dos registros.

O método “cursor.GetCount()” nos permite descobrir se possuímos ou não registros, Já o “cursor.MoveToFirst()” nos desloca para o primeiro Registro da tabela.

Implementando o Método para Mostrar os Dados

Quando executamos uma consulta com o BD armazenamos os dados no cursor, portanto agora precisamos recuperar os registros para poder mostrar em um textbox por exemplo, veja a seguir o método que faz exatamente esta tarefa.

public void MostrarDados()
{    
    txtCod.setText(cursor.getString(cursor.getColumnIndex("COD_CLI")));
txtCli.setText(cursor.getString(cursor.getColumnIndex("NOM_CLI")));           txtCid.setText(cursor.getString(cursor.getColumnIndex("CID_CLI")));
txtEst.setText(cursor.getString(cursor.getColumnIndex("EST_CLI")));
txtCur.setText(cursor.getString(cursor.getColumnIndex("PRO_CLI")));
}

O método “GetString()” retorna uma string a partir de um index. Portanto utilizamos o “GetColumnIndex()” passando como parâmetro o nome do campo para obter o registro correspondente.

Nenhum comentário:

Postar um comentário