148 pág.

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,