Android Banco de Dados Ivan Nicoli
SQLite O Android tem suporte ao SQLite (http://www.sqlite.org), um leve e poderoso banco de dados. Cada aplicação pode criar um ou mais banco de dados, que ficam localizados na pasta: /data/data/<pacote-aplicação>/databases/ É possível adicionar o banco de dados à aplicação basicamente de duas formas: Utilizando a API do Android para SQLite para gerar todas as tabelas na primeira vez que a aplicação for executada. Adicionar o arquivo correspondente ao banco de dados diretamente na pasta do Android.
Exercício 1 Criando os Scripts Crie um projeto do tipo Android Project, com o nome ExemploSQLite, com o pacote br.edu.facear.exemplosqlite. Na pasta assets crie um arquivo chamado alunos.sql, abra o arquivo (a criação deste arquivo é opcional). Em Type, selecione a opção SQLITE_XXX e com a ajuda do editor crie o script: DROP TABLE alunos; CREATE TABLE alunos( _id INTEGER PRIMARY KEY autoincrement, nome varchar); insert into alunos(_id,nome) values(1,"aluno1"); insert into alunos(_id,nome) values(2,"aluno2"); insert into alunos(_id,nome) values(3,"aluno3");
Exercício 2 SQLite3 (1/2) O SDK do Android disponibiliza o aplicativo sqlite3 na pasta tools. O mesmo aplicativo está disponível nos dispositivos e no emulador do Android. Execute o aplicativo que acabou de ser criado. Acesse o prompt de comando e digite o comando: adb shell Navegue na árvore de diretórios: cd /data/data/br.edu.facear.exemplosqlite mkdir databases cd databases Digite o comando: sqlite3 alunos
Exercício 2 SQLite3 (2/2) Execute o script construído anteriormente: DROP TABLE alunos; CREATE TABLE alunos( _id INTEGER PRIMARY KEY autoincrement, nome varchar); insert into alunos(_id,nome) values(1,"aluno1"); insert into alunos(_id,nome) values(2,"aluno2"); insert into alunos(_id,nome) values(3,"aluno3"); Verifique os dados pelo comando: select * from alunos; Para verificar o banco de dados construído digite o comando:.database Para sair, digite o comando:.quit
Exercício 3 Acessando os Dados Renomeie a Activity padrão gerada pelo projeto para AlunosListActivity, com o seguinte conteúdo: public class AlunosListActivity extends ListActivity { private SQLiteDatabase db; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); db = this.openorcreatedatabase("alunos", Context.MODE_PRIVATE, null); // select * from alunos order by nome; Cursor c = db.query("alunos", null, null, null, null, null, "nome"); startmanagingcursor(c); // Criando um adapter do resultado da query. SimpleCursorAdapter sca = new SimpleCursorAdapter(this, android.r.layout.simple_list_item_1, c, new String[] { "nome", new int[] { android.r.id.text1 ); // Adicionando o Adapter a ListActivity setlistadapter(sca);
Exercício 3 Gerenciador de Alunos (1/4) Crie uma nova Activity chamada GerenciarAlunos. Adicione a implementação do método oncreate: protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); db = this.openorcreatedatabase("alunos", Context.MODE_PRIVATE, null); setcontentview(r.layout.gerenciaraluno); this.id = (EditText) findviewbyid(r.id.idaluno); this.nome = (EditText) findviewbyid(r.id.nomealuno); this.id.settext(getintent().getintextra("_id", -1) + ""); this.nome.settext(getintent().getstringextra("nome") + ""); Button inserir = (Button) findviewbyid(r.id.inseriraluno); inserir.setonclicklistener(this); Button remover = (Button) findviewbyid(r.id.removeraluno); remover.setonclicklistener(this); Button editar = (Button) findviewbyid(r.id.editaraluno); editar.setonclicklistener(this);
Exercício 3 Gerenciador de Alunos (2/4) E o método onclick: public void onclick(view v) { int id = Integer.parseInt(this.id.getText().toString()); String nome = this.nome.gettext().tostring(); ContentValues valores; switch (v.getid()) { case R.id.inserirAluno: valores = new ContentValues(); valores.put("nome", nome); // insert into alunos(_id,nome) values(?,?); db.insert("alunos", null, valores); break; case R.id.editarAluno: valores = new ContentValues(); valores.put("nome", nome); // update alunos set nome=? from alunos where id=? db.update("alunos", valores, "_id=?", new String[] { id + "" ); break; case R.id.removerAluno: // delete alunos where _id=?; db.delete("alunos", "_id=?", new String[] { id + "" ); break; db.close(); finish();
Exercício 3 Gerenciador de Alunos (3/4) Adicione os métodos e os atributos abaixo na classe AlunosListActivity: private EditText id; private EditText nome; private SQLiteDatabase db; protected void onlistitemclick(listview l, View v, int position, long id) { super.onlistitemclick(l, v, position, id); // Obtendo objeto selecionado Cursor c = (Cursor) getlistadapter().getitem(position); Intent gerenciaralunos = new Intent(this, GerenciarAlunos.class); gerenciaralunos.putextra("_id", c.getint(c.getcolumnindexorthrow("_id"))); gerenciaralunos.putextra("nome", c.getstring(c.getcolumnindexorthrow("nome"))); startactivityforresult(gerenciaralunos, 1234); protected void onactivityresult(int requestcode, int resultcode, Intent data) { super.onactivityresult(requestcode, resultcode, data); Cursor c = ((SimpleCursorAdapter) getlistadapter()).getcursor(); c.requery();
Exercício 3 Gerenciador de Alunos (4/4) Crie um arquivo xml de layout chamado gerenciaraluno.xml, adicione o conteúdo a seguir: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <EditText android:id="@+id/idaluno" style="@style/dim" android:hint="@string/identificador_aluno" /> <EditText android:id="@+id/nomealuno" style="@style/dim" android:hint="@string/nome_aluno"><requestfocus /></EditText> <Button android:id="@+id/inseriraluno" style="@style/dim" android:text="@string/inserir_aluno" /> <Button android:id="@+id/editaraluno" style="@style/dim" android:text="@string/atualizar_aluno" /> <Button android:id="@+id/removeraluno" style="@style/dim" android:text="@string/remover_aluno" /> </LinearLayout>
Gerando banco pela API O Android fornece a classe SQLiteOpenHelper que apoia a criação do dinâmica do banco pelo aplicativo. Para utiliza-la basta criar uma subclasse e implementar os métodos: oncreate: Executado quando a aplicação é iniciada, caso o banco não exista. onupgrade: Executado em atualizações do aplicativo quando é necessário alterar o schema dos dados.
Exercício 4 - Gerando banco pela API (1/2) Crie a classe AlunoOpenHelper no pacote br.edu.facear.exemplosqlite.database e adicione o conteúdo: public class AlunoOpenHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "alunos"; private static final int DB_VERSION = 1; private static final String CREATE_ALUNOS = "CREATE TABLE alunos(" + "_id INTEGER PRIMARY KEY autoincrement," + "nome varchar);"; private static final String INSERT_A1 = "insert into alunos(nome) values(\"aluno1\");"; private static final String INSERT_A2 = "insert into alunos(nome) values(\"aluno2\");"; private static final String INSERT_A3 = "insert into alunos(nome) values(\"aluno3\");"; public AlunoOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); public AlunoOpenHelper(Context context, CursorFactory factory) { this(context, DATABASE_NAME, factory, DB_VERSION); @Override public void oncreate(sqlitedatabase db) { db.execsql(create_alunos); db.execsql(insert_a1); db.execsql(insert_a2); db.execsql(insert_a3); @Override public void onupgrade(sqlitedatabase db, int oldversion, int newversion) {
Exercício 4 - Gerando banco pela API (2/2) Nas classes AlunosListActivity e GerenciarAlunos, altere a chamada: db = this.openorcreatedatabase("alunos", Context.MODE_PRIVATE, null); Pela chamada: // db = this.openorcreatedatabase("alunos", Context.MODE_PRIVATE, null); db = (new AlunoOpenHelper(this, null)).getwritabledatabase(); Se o arquivo do banco de dados for excluído, a aplicação executará o script automaticamente.
Fim