A maior rede de estudos do Brasil

Grátis
148 pág.
Apostila de Desenvolvimento Java para Dispositivos Móveis

Pré-visualização | Página 12 de 25

mas também daqueles com iOS! Sim, o iPhone e o iPad também possuem o SQLite instalado e usam o banco 
para armazenar boa parte dos dados dos seus aplicativos.
Android: Desenvolvimento para Dispositivos Móveis
75
Apesar de a API do SQLite estar originalmente em C, a Google criou classes Java que abstraem os prin-
cipais comandos para manipulação do banco. 
Neste módulo, conheceremos as duas principais: SQLiteDatabase e SQLiteOpenHelper.
8.2 Criação do banco de dados 
O primeiro passo para fazer com que seu aplicativo possa usar o SQLite é criar uma subclasse de SQLiteO-
penHelper. Esta classe existe para facilitar a abertura e, caso ainda não exista, a criação do banco de dados.
Basta criar uma classe Java básica herdando SQLiteOpenHelper e implementar o seu evento onCreate, 
que será usado para criar a(s) tabela(s) do banco (somente quando ele ainda não tiver sido criado).
No Quadro 21 você pode ver um exemplo de classe para abrir e criar um banco de dados com uma tabela 
para armazenar a lista de compras criada na seção 5.3.
A nossa subclasse de SQLiteOpenHelper precisa possuir os três métodos existentes na listagem do Quadro 
21: um construtor, o evento onCreate e o evento onUpdate. Este último somente é usado quando o banco 
precisar sofrer alguma atualização.
O onCreate é obrigatório, pois será executado quando o aplicativo tentar abrir um banco que ainda não 
existe. Ou seja, é ele que faz a criação inicial da estrutura do banco a ser usado!
No exemplo do Quadro 21, executamos no banco de dados (por meio do objeto db da classe SQLiteDa-
tabase, recebido por onCreate) um comando SQL CREATE TABLE, para criar a estrutura da tabela produtos. 
Ela possui os seguintes campos:
• _id: o campo inteiro (INTEGER) chave primária (PRIMARY KEY), que será único para cada pro-
duto e será gerado automaticamente (AUTOINCREMENT) como um número inteiro. Precisamos 
usar este nome exato (_id) para facilitar a ligação da tabela com um ListView – falaremos mais 
sobre isso depois.
• nome: um campo do tipo TEXT (equivalente à String ou VARCHAR em outros SGBDs) para arma-
zenar a descrição/nome do produto.
• quantidade: um campo inteiro (INTEGER) para guardar a quantidade a ser comprada do produto.
O comando é executado no banco por meio do método execSQL() do objeto db.
Em seguida, executamos mais três comandos SQL para inclusão (INSERT) de alguns produtos de exem-
plo no banco, junto das suas respectivas quantidades.
Android: Desenvolvimento para Dispositivos Móveis
76
Quadro 21 – Código para classe BancoListaOpenHelper
package posjava.android.listasql;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class BancoListaOpenHelper extends SQLiteOpenHelper {
 
 public BancoListaOpenHelper(Context contexto, String nome, 
 CursorFactory fabrica, int versao) {
 super(contexto, nome, fabrica, versao);
 }
 
 @Override
 public void onCreate(SQLiteDatabase db) {
 String criarTabela = “CREATE TABLE produtos “ +
 “(_id INTEGER PRIMARY KEY AUTOINCREMENT, “ +
 “nome TEXT,” +
 “quantidade INTEGER);”;
 
 db.execSQL(criarTabela);
 
 db.execSQL(“INSERT INTO produtos (nome, quantidade) “ +
 “VALUES (‘Arroz’, 1)”);
 db.execSQL(“INSERT INTO produtos (nome, quantidade) “ +
 “VALUES (‘Feijão’, 2)”);
 db.execSQL(“INSERT INTO produtos (nome, quantidade) “ +
 “VALUES (‘Laranja’, 12)”);
 
 }
 
 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 } 
}
Android: Desenvolvimento para Dispositivos Móveis
77
Para saber mais sobre a sintaxe SQL e tipos de dados suportados pelo SQLite, 
acesse a documentação oficial em <http://www.sqlite.org/docs.html>.
8.3 Criação da classe DAO para acesso aos dados
Como as operações comuns no banco de dados (inclusão, consulta, exclusão e alteração) envolvem 
o uso de diversos métodos, e estes são sempre relativos a um determinado sistema, é uma boa prática 
organizá-los em uma classe própria para a finalidade de manipulação dos dados no banco.
Esta classe é comumente conhecida como classe DAO (Data Access Object), que é que uma classe 
Java padrão que encapsula todos os procedimentos de manipulação dos dados, assim como abertura e 
fechamento do banco.
Para utilizá-la no seu aplicativo, crie uma classe Java padrão e chame-a de Dao. Acrescente a ela o có-
digo existente no Quadro 22.
Quadro 22 – Código para classe Dao
 
package posjava.android.listasql;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
public class Dao {
 
 private static final String NOME_DO_BANCO = “ListaDeCompras.db”;
 private SQLiteDatabase banco;
 private BancoListaOpenHelper bancoOpenHelper;
 
 public Dao(Context context) {
 bancoOpenHelper = new BancoListaOpenHelper(context, NOME_DO_BANCO,
 null, 1);
 }
Android: Desenvolvimento para Dispositivos Móveis
78
public void abrir() throws SQLException {
 banco = bancoOpenHelper.getWritableDatabase();
 }
 
 public void fechar() {
 if (banco != null)
 banco.close();
 }
public void inserirProduto(String nome, int quantidade) {
 ContentValues novoProduto = new ContentValues();
 novoProduto.put(“nome”, nome);
 novoProduto.put(“quantidade”, quantidade);
 banco.insert(“produtos”, null, novoProduto);
 }
 
 public void alterarProduto(long id, String nome, int quantidade) {
 ContentValues produtoAlterado = new ContentValues();
 produtoAlterado.put(“nome”, nome);
 produtoAlterado.put(“quantidade”, quantidade);
 banco.update(“produtos”, produtoAlterado, “_id = “ + id, null);
 }
 
 public void removerProduto(long id) {
 banco.delete(“produtos”, “_id = “ + id, null);
 }
 
 public Cursor obterTodosOsProdutos() {
 return banco.query(“produtos”, null, null, null, 
 null, null, “nome”);
 }
 
}
• Como na classe Dao realizaremos todo o acesso ao banco, precisamos ter dentro dela uma instância 
de SQLiteDatabase e outra de BancoListaOpenHelper.
• O construtor dessa classe recebe um Context como parâmetro. Ele chamará por sua vez o cons-
trutor de BancoListaOpenHelper passando a ele: o contexto atual; uma String especificando um 
nome para o arquivo de banco de dados; null no terceiro parâmetro, pois não usaremos Cursor-
Factory; e 1 no último parâmetro, sendo este o número de versão do banco. O objeto instanciado 
ficará armazenado em bancoOpenHelper.
• O método abrir faz a obtenção do objeto SQLiteDatabase gravável que servirá de “ponte de aces-
so” ao arquivo de banco de dados, por meio do método getWritableDatabase do openHelper; 
assim, seu retorno deve ficar armazenado em um objeto SQLiteDatabase – banco.
Android: Desenvolvimento para Dispositivos Móveis
79
• Já o método fechar realiza o fechamento de banco, caso este seja diferente de null (significando 
que o mesmo foi aberto).
• O método inserirProduto é uma abstração para o método insert existente no objeto banco. 
Passamos ao inserirProduto um nome de produto e uma quantidade, para serem inseridos como 
um novo registro do banco. Um objeto da classe ContentValues chamado novoProduto é então 
usado para fazer a correspondência entre os campos da tabela e os valores a serem colocados neles, 
por meio do seu método put(campo, valor). Este objeto é então passado ao método insert, junto 
do nome da tabela na qual o registro será incluído.
• A modificação de um produto na lista é feita com o método alterarProduto. Seu funcionamento 
é muito parecido com inserirProduto, contudo, como estamos alterando os valores de um produto 
existente, passamos ao alterarProduto o id do produto sendo modificado,