Mobile

Databases em Android

 Android: SQLite.

 

O Android provê toda a estrutura necessária para criação e manutenção de bancos de dado SQLite. Todos os devices android possuem suporte para o SQLite e a única preocupação que o desenvolvedor deve ter é a de preparar as declarações para criação e manutenção do banco de dados. Implementadas estas declarações, a plataforma provê todo o suporte necessário para a manutenção da base de dados.

Todos os bancos de dados criados são salvos no seguinte diretório: DATA/data/APP_NAME/databases/FILENAME
Aonde:
DATA é o retorno de “Environment.getDataDirectory()”;
APP_NAME é o nome da sua aplicação, e;
FILENAME é o nome especificado por você para a base de dados;

As bases de dados criadas são acessíveis para todas as classes dentro da aplicação, mas não para classes externas.

SQLiteOpenHelper
Esta classe fornecida pela plataforma permite que você crie e atualize as bases criadas para uma aplicação. Extendendo esta classe, os métodos onCreate e onUpgrade devem ser sobrescritos e preenchidos com as funcionalidades desejadas para criação e atualização da base, respectivamente.

As tabelas em android devem possuir um identificador _id para a chave primária da tabela. Este é o padrão utilizado e diversas funções do Android dependem deste padrão. Como será demonstrado à seguir, é uma boa prática separar uma classe por tabela.

SQLiteDatabase
Esta outra classe fornecida pela plataforma provê funcionalidades de acesso e gerenciamento à bases de dados já existentes. Algumas das possibilidades com esta classe são a utilização de métodos fornecidos como insert, update e delete, e a execução de queries diretamente nas bases de dados, através do método execSQL.

Agora chega de papo e vamos ao código!

Este é o modelo, para que possamos trabalhar em um nivel de abstração mais alto, e não com dados retirados do banco:

[cc lang=”java” width=”100%”]
package br.com.;

public class Usuario {

private long id;
private String nome;

public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

// Sera utilizado pelo ArrayAdapter para renderizar o model na ListView
@Override
public String toString() {
return nome;
}

}
[/cc]

Esta é a classe de criação e atualização da base de dados. Nela, definimos o nome da base, o nome das tabelas e colunas a serem criadas e a versao atual da base de dados.

[cc lang=”java” width=”100%”]
package br.com.;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class UsuarioSQLiteHelper extends SQLiteOpenHelper {

//Nome da tabela a ser criada
public static final String TABELA_USUARIO = “usuarios”;

//Colunas da tabela USUARIOS
public static final String COLUNA_ID = “_id”;
public static final String COLUNA_NOME = “nome”;

// Nome do banco de dados
private static final String DATABASE_NAME = “usuario.db”;

// Versao atual do banco de dados (Utilizada para controle e atualizacao de
// bancos posteriormente)
private static final int DATABASE_VERSION = 1;

// SQL para criacao da tabela
private static final String DATABASE_CREATE = “create table ”
+ TABELA_USUARIO + “( ” + COLUNA_ID
+ ” integer primary key autoincrement, ” + COLUNA_NOME
+ ” text not null);”;

//Construtor da classe
public UsuarioSQLiteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase database) {
database.execSQL(DATABASE_CREATE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int versaoAntiga, int novaVersao) {
//Log informando que a tabela está sendo reconstruida
Log.w(UsuarioSQLiteHelper.class.getName(),
“Atualizando a base de dados da versao ” + versaoAntiga + ” para ”
+ novaVersao);
db.execSQL(“DROP TABLE IF EXISTS ” + TABELA_USUARIO);
onCreate(db);
}

}
[/cc]

Este é o nosso DAO de acesso ao banco, nele definimos funções de manutenção de dados, tais como criação, remoção e listagem de entidades.

[cc lang=”java” width=”100%”]
package br.com.;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;

public class UsuarioDAO {

// Database fields
private SQLiteDatabase database;
private UsuarioSQLiteHelper dbHelper;
private String[] colunas = { UsuarioSQLiteHelper.COLUNA_ID, UsuarioSQLiteHelper.COLUNA_NOME };

public UsuarioDAO(Context context) {
dbHelper = new UsuarioSQLiteHelper(context);
}

//Inicia conexao com o banco de dados
public void open() throws SQLException {
database = dbHelper.getWritableDatabase();
}

//Finaliza a conexao com o banco de dados
public void close() {
dbHelper.close();
}

//Metodo para criacao de usuario
public Usuario criarUsuario(String nome) {
ContentValues values = new ContentValues();
values.put(UsuarioSQLiteHelper.COLUNA_NOME, nome);
long insertId = database.insert(UsuarioSQLiteHelper.TABELA_USUARIO, null,
values);
Cursor cursor = database.query(UsuarioSQLiteHelper.TABELA_USUARIO,
colunas, UsuarioSQLiteHelper.COLUNA_ID + ” = ” + insertId, null,
null, null, null);
cursor.moveToFirst();
Usuario usuario = criaUsuario(cursor);
cursor.close();
return usuario;
}

//Metodo para deletar usuario
public void deletarUsuario(Usuario usuario) {
long id = usuario.getId();
System.out.println(“Usuario deletado: ” + id);
database.delete(UsuarioSQLiteHelper.TABELA_USUARIO, UsuarioSQLiteHelper.COLUNA_ID
+ ” = ” + id, null);
}

//Metodo para listar todos usuarios no banco de dados
public List listarUsuarios() {
List usuarios = new ArrayList();

Cursor cursor = database.query(UsuarioSQLiteHelper.TABELA_USUARIO,
colunas, null, null, null, null, null);

cursor.moveToFirst();
while (!cursor.isAfterLast()) {
Usuario usuario = criaUsuario(cursor);
usuarios.add(usuario);
cursor.moveToNext();
}

// Finaliza o cursor
cursor.close();
return usuarios;
}

//Cria um usuario a partir do cursor de listagem
private Usuario criaUsuario(Cursor cursor) {
Usuario usuario = new Usuario();
usuario.setId(cursor.getLong(0));
usuario.setNome(cursor.getString(1));
return usuario;
}
}
[/cc]

Estes dois trechos de código a seguir não serão cobertos nesse post, apenas completam o projeto, para que possa ser utilizado. Nesta classe a seguir, definimos a nossa tela e o tratamento de eventos lançados pela interface de usuário. No xml abaixo, definimos a estrutura visual desta tela da nossa aplicação.

[cc lang=”java” width=”100%”]
package br.com.;

import java.util.List;
import java.util.Random;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;

public class TestDatabaseActivity extends ListActivity {
private UsuarioDAO usuarioDAO;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

usuarioDAO = new UsuarioDAO(this);
usuarioDAO.open();

Listvalues = usuarioDAO.listarUsuarios();

// Usa-se um SimpleCursorAdapter para mostrar os elementos na ListView
ArrayAdapter adapter = new ArrayAdapter(this,
android.R.layout.simple_list_item_1, values);
setListAdapter(adapter);
}

// Metodo chamado quando os botoes da tela sao acionados
// Este metodo, de acordo com o botao acionado, cria ou deleta usuarios na base de dados.
public void onClick(View view) {
@SuppressWarnings(“unchecked”)
ArrayAdapter adapter = (ArrayAdapter) getListAdapter();
Usuario usuario = null;
switch (view.getId()) {
case R.id.add:
String[] usuarios = new String[] { “Joao”, “Maria”, “Jose” };
int nextInt = new Random().nextInt(3);
// Save the new comment to the database
usuario = usuarioDAO.criarUsuario(usuarios[nextInt]);
adapter.add(usuario);
break;

case R.id.delete:
if (getListAdapter().getCount() > 0) {
usuario = (Usuario) getListAdapter().getItem(0);
usuarioDAO.deletarUsuario(usuario);
adapter.remove(usuario);
}
break;
}
adapter.notifyDataSetChanged();
}

/**
* Os metodos a seguir são de extrema importancia.
* O android possui um ciclo de vida de suas atividades e é importante que sua aplicacao faça os tratamentos necessarios
* em cada um dos ciclos.
*
*/

//Ao entrar na aplicação, a conexao com o banco de dados é aberta
@Override
protected void onResume() {
usuarioDAO.open();
super.onResume();
}

//Ao sair da aplicacao, a conexao com o banco de dados é fechada
@Override
protected void onPause() {
usuarioDAO.close();
super.onPause();
}
}

[/cc]

[cc lang=”xml” width=”100%”]

4 Comments

  • Muito bom o material, segui e implementei e funcinou perfeitamente!
    Agora vou para a segunda parte!

    Como você mesmo solicitou no fim do conteúdo… só tem dois pequenos detalhes de formatação para corrigir…
    na linha 47 da classe TestDatabaseActivity no if ao invés de sair um sinal de menor “<" acabou saindo o código do caractere: > isso pode talvez confundir alguém!
    E o outro é tão insignificante que eu não ia nem comentar… na linha 23 só faltou um espaço entre o List e o values: Listvalues.

    É claro que esses mínimos detalhes não desabona nem um pouco este ótimo tutorial!
    Obrigado Lucas!

  • Coloquei o código do sinal que ficou na linha 47 no comentário anterior e acabou sendo impresso o próprio sinal de >… por isso vou colocar espaçadamente, no código mostra &gt ; ao invés de o próprio sinal de menor.

  • […] Neste post eu realizarei algumas alterações nas classes apresentadas nos posts anteriores (Databases em Android – Parte 1 e Databases em Android – Parte 2) para a utilização do framework, demonstrando como fica […]

  • […] A estrutura de criação e acesso ao banco deve ser feita como demonstrada no post anterior “Database no Android – Parte 1”, e por isso, neste exemplo apenas demonstrarei os métodos de inserção e recuperação da […]

Deixe um comentário

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

Compartilhe isso: