Programação para Dispositivos Móveis Banco de Dados (SQLite)
SQLite O Android possui suporte nativo ao SQLite O SQLite é um mecanismo de banco de dados SQL incorporado. Ao contrário da maioria dos outros bancos de dados SQL, o SQLite não possui um processo de servidor separado. O SQLite lê e grava diretamente em arquivos de disco comuns. Um banco de dados SQL completo com várias tabelas, índices, acionadores e visualizações está contido em um único arquivo de disco. Fonte: https://www.sqlite.org/about.html
SQLite O banco de dados criado pela aplicação ficará armazenado no sistema, podendo ser visualizado apenas pela aplicação que o criou.
SQLite Utilizaremos duas classes para a criação do banco de dados: SQLiteDatabase: Contém os métodos de manipulação dos dados no banco; SQLiteOpenHelper: Encapsula o processo de criação e atualização do banco de dados no dispositivo
Desenvolvendo uma aplicação com o uso de banco de dados
Aplicação Faremos um controle de biblioteca, com as oções: Cadastrar livro Alterar dados do livro Listar livros cadastrados Remover livros
Aplicação Faremos um controle de biblioteca, com as oções: Cadastrar livro Listar livros cadastrados Atualizar/Alterar dados do livro Remover livros Faremos o CRUD Acrônimo para: Create, Read, Update e Delete.
Aplicação Faremos um controle de biblioteca, com as oções: Cadastrar livro Listar livros cadastrados Atualizar/Alterar dados do livro Remover livros Faremos o CRUD Acrônimo para: Create, Read, Update e Delete.
Pacote BancoDados Criaremos no diretório de nosso projeto o pacote BancoDados Botão direito sobre o diretório Java >> New >> Package Dê o nome de BancoDados Dentro deste pacote criaremos duas classes Banco CRUD A classe Banco herdará os métodos oncreate e onupgrade da classe SQLiteOpenHelper Na classe CRUD colocaremos os métos de inserção, leitura, atualização e remoção de dados.
Classe Banco Este método é chamado quando a aplicação cria o banco de dados pela primeira vez. Nele criaremos as tabelas. public class Banco extends SQLiteOpenHelper { public Banco(Context context){ public void oncreate(sqlitedatabase db){ public void onupgrade(sqlitedatabase db, int oldversion, int newversion){
Classe Banco Este método será invocado quando precisarmos atualizar alguma informação estrutural (inserção ou remoção de colunas por exemplo) public class Banco extends SQLiteOpenHelper { public Banco(Context context){ public void oncreate(sqlitedatabase db){ public void onupgrade(sqlitedatabase db, int oldversion, int newversion){
Classe Banco Os dois métodos recebem como parâmetro uma instância do SQLiteDataBase, aqui chamada de db; O método onupgrade ainda recebe como parâmetros dois valores inteiros: um representando o valor antigo da tabela e o outro contém a nova versão para o qual o upgrade será executado
Classe Banco Criaremos então uma tabela chamada livros; Esta tabela terá os campos: id, titulo, autor e editora; Em SQL temos o seguinte comando para criação de tabelas: CREATE TABLE livros ( id integer primary key autoincrement, titulo text, autor text, editora text )
Classe Banco O mesmo código SQL visto anteriormente colocaremos dentro do método oncreate
Classe Banco public class Banco extends SQLiteOpenHelper { private static final String NOME_BANCO = "biblioteca.db"; private static final String TABELA = "livros"; O private mesmo static código final SQL String visto ID anteriormente = "_id"; colocaremos dentro do método private static final String TITULO = "titulo"; oncreate private static final String AUTOR = "autor"; private static final String EDITORA = "editora"; private static final int VERSAO = 1; public Banco(Context context){ public void oncreate(sqlitedatabase db){ String sql = "CREATE TABLE " + TABELA + "(" + ID + " integer primary key autoincrement," + TITULO + " text,"+ AUTOR + " text,"+ EDITORA + " text)"; db.exec(sql); //executa a string sql public void onupgrade(sqlitedatabase db, int oldversion, int newversion){
Classe Banco O método onupgrade possui um comando SQL que apaga a tabela antiga e invoca o método oncreate() para criar uma nova tabela.
Classe Banco public class Banco extends SQLiteOpenHelper { private static final String NOME_BANCO = "biblioteca.db"; private static final String TABELA = "livros"; private static final String ID = "_id"; private static final String TITULO = "titulo"; O private método static onupgrade final String possui AUTOR um comando = "autor"; SQL que apaga a tabela antiga e private static final String EDITORA = "editora"; invoca o método oncreate() para criar uma nova tabela. private static final int VERSAO = 1; public Banco(Context context){ public void oncreate(sqlitedatabase db){ String sql = "CREATE TABLE " + TABELA + "(" + ID + " integer primary key autoincrement," + TITULO + " text,"+ AUTOR + " text,"+ EDITORA + " text)"; db.exec(sql); //executa a string sql public void onupgrade(sqlitedatabase db, int oldversion, int newversion){ db.execsql("drop TABLE IF EXISTS livros"); oncreate(db);
Classe Banco Por fim, o construtor Banco envia para a super classe as informações do local e versão do banco
Classe Banco public class Banco extends SQLiteOpenHelper { private static final String NOME_BANCO = "biblioteca.db"; private static final String TABELA = "livros"; private static final String ID = "_id"; Por private fim, o static construtor final Banco String envia TITULO para = "titulo"; a super classe as informações do local e private static final String AUTOR = "autor"; versão do banco private static final String EDITORA = "editora"; private static final int VERSAO = 1; public Banco(Context context){ super(context, biblioteca.db,null,versao);//biblioteca.db é o nome do banco public void oncreate(sqlitedatabase db){ String sql = "CREATE TABLE " + TABELA + "(" + ID + " integer primary key autoincrement," + TITULO + " text,"+ AUTOR + " text,"+ EDITORA + " text)"; db.exec(sql); //executa a string sql public void onupgrade(sqlitedatabase db, int oldversion, int newversion){
Activities e CRUD Dividiremos o trabalho em duas fases Primeiramente criaremos as Activities do nosso projeto Depois, criaremos os métodos para a classe CRUD
Activity: Cadastrar Livros Está é a Activity para cadastrar livros no banco de dados; Nela teremos 3 TextViews, 3 EditTexts e 1 Button; O código como sugestão para esta activity encontra-se no próximo slide
Activity: Cadastrar Livros <LinearLayout xmlns:android="http://schemas.android.com/apk/res/a ndroid" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".activity_cadastrar" android:orientation="vertical" android:id="@+id/inserir"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="titulo:" android:id="@+id/textview"/> <EditText android:hint="digite o título do livro" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/edittext" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="autor:" android:id="@+id/textview2" /> <EditText android:hint="digite o nome do autor" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/edittext2" android:layout_below="@+id/textview2" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="editora:" android:id="@+id/textview3" /> <EditText android:hint="digite o nome da editora" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/edittext3" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="cadastrar" android:id="@+id/button" /> </LinearLayout>
Activity: Cadastrar Livros
Activity: Consulta Livros Para listarmos os livros do banco de dados, precisamos criar a interface; Teremos uma listview e um arquivo XML de layout responsável por estiliza-lá; O código como sugestão para esta activity encontra-se no próximo slide
Activity: Consulta Livros <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.constraintlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".activity_consulta"> <ListView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/listview" android:layout_alignparentleft="true" android:layout_alignparentstart="true" /> </android.support.constraint.constraintlayout>
Activity: Consulta Livros Agora vamos criar o estilo para a nossa activity Consulta Para isso, clique sobre o diretório layout >> New >> Layout resource file Dê o nome de livros_layout.xml O código como sugestão para este arquivo de layout encontra-se no próximo slide
Activity: Consulta Livros <GridLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:columncount="2" android:rowcount="2" > <TextView android:id="@+id/idlivro" android:layout_width="0dip" android:layout_gravity="fill_horizontal" android:layout_height="wrap_content" android:layout_marginleft="5dp" android:layout_margintop="10dp" android:text="id" /> <TextView android:id="@+id/nomelivro" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginleft="5dp" android:layout_margintop="5dp" android:text="titulo" /> </GridLayout>
Activity: Alterar Livros A próxima activity será responsável por alterar os dados do livro Para alterar um dado contido no banco, devemos recuperar uma informação única de cada um deles e realizar a operação O código como sugestão para esta activity encontra-se no próximo slide
Activity: Alterar Livros <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".activity_cadastrar" android:id="@+id/alter"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="titulo:" android:id="@+id/textview4" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/edittext4" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="autor:" android:id="@+id/textview5" /> <EditText android:layout_width="match_parent" /> android:layout_height="wrap_content" android:id="@+id/edittext5" <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="editora:" android:id="@+id/textview6" /> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/edittext6" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="alterar" android:id="@+id/button2" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="deletar" android:id="@+id/button3"/> </LinearLayout>
Activity: Deletar Livros A opção de deletar será utilizada juntamente com a activity de alterar Desta forma, o botão deletar ficará no mesmo layout (activity) alterar
Classe CRUD Até o momento temos as Activities, porém ainda não existe nada codificado, nenhuma ação para elas foram implementadas Agora vamos colocar as ações na classe CRUD e codificar nossas Activities
Classe CRUD A classe CRUD será reponsável por controlar as manipulações ao banco. O código base desta classe encontra-se no próximo slide
Classe CRUD public class CRUD { private SQLiteDatabase db; private Banco banco; public CRUD(Context context){ //método construtor banco = new Banco(context); //objeto do tipo Banco
Inserir dados
Classe CRUD Método inseredados Na classe CRUD, criamos um construtor público e instanciamos o atributo banco, passando por parâmetro para a Activity o contexto Agora vamos criar o método inseredados que rebecerá como parâmetros o título, o autor e a editora Também teremos o atributo db que retorna o resultado do método getwritabledatabase(), permitindo o android a leitura e escrita de dados
Classe CRUD public class CRUD { private SQLiteDatabase db; private Banco banco; public CRUD(Context context){ //método construtor banco = new Banco(context); //objeto do tipo Banco public String inseredados(string titulo, String autor, String editora){ ContentValues valores; long resultado; db = banco.getwritabledatabase(); valores = new ContentValues(); valores.put(banco.titulo, titulo); valores.put(banco.autor, autor); valores.put(banco.editora, editora); resultado = db.insert(banco.tabela, null, valores); db.close(); if(resultado==-1) return "Erro ao inserir o registro"; else return "Registro inserido com sucesso";
Classe CRUD Método inseredados O método insert recebe como parâmetro a tabela em que os dados serão manipulados, um parâmetro nulo e o map com os dados que serão inseridos no banco Este map é criado pela classe ContentValue Lembre-se: é importante fechar a conexão com o banco depois de manipulá-lo
Classe CRUD Método inseredados O método insert recebe como parâmetro a tabela em que os dados serão manipulados, um parâmetro nulo e o map com os dados que serão inseridos no banco Este map é criado pela classe ContentValue Lembre-se: é importante fechar a conexão com o banco depois de manipulá-lo
Activity Cadastrar No próximo slide, apresento o código da Activity Cadastrar
public class Activity_Cadastrar extends AppCompatActivity { Button botao; @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_cadastrar); botao = (Button)findViewById(R.id.button); botao.setonclicklistener(new View.OnClickListener() { @Override public void onclick(view v) { CRUD crud = new CRUD(getBaseContext()); EditText titulo = (EditText)findViewById(R.id.editText); EditText autor = (EditText)findViewById((R.id.editText2)); EditText editora = (EditText)findViewById(R.id.editText3); String titulostring = titulo.gettext().tostring(); String autorstring = autor.gettext().tostring(); String editorastring = editora.gettext().tostring(); String resultado; resultado = crud.inseredados(titulostring,autorstring,editorastring); ); Toast.makeText(getApplicationContext(), resultado, Toast.LENGTH_LONG).show();
Activity Cadastrar O conteúdo dos EditTexts são capturados e convertidos para String. O método inseredado envia por parâmetro as informações a serem adicionadas no banco O resultado retornado do método, será exibido como uma mensagem (Toast) na tela mostrando se a operação foi um sucesso ou não.
Consulta Dados
Classe CRUD Método carregadados Na classe CRUD vamos adicionar o método carregadados(), equivalente ao SELECT em SQL, apesar de não utilizar nenhum comando SQL O código do método é apresentado no próximo slide
Classe CRUD Método carregadados public Cursor carregadados(){ Cursor cursor; String[] campos = {banco.id,banco.titulo; db = banco.getreadabledatabase(); cursor = db.query(banco.tabela, campos, null, null, null, null, null, null); if(cursor!=null){ cursor.movetofirst(); db.close(); return cursor;
Classe CRUD Método carregadados São definidos os campos que a consulta retornará no array de Strings campos O objeto db recebe retorno do método getreadabledatabase da classe Banco que fará com que os dados sejam acessados como somente para leitura O método query retorna um Cursor, uma classe do Android que salva as informações que são retornadas do banco de dados (tabela e os campos desejados). Antes do cursor ser retornado para ser tratado na interface do usuário deve-se mover seu conteúdo para a primeira posição para que todos os dados sejam exibidos (cursor.movetofirst())
Activity Consulta No próximo slide, apresento o código da Activity Consulta
public class Activity_Consulta extends AppCompatActivity { private ListView lista; @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_consulta); CRUD crud = new CRUD(getBaseContext()); final Cursor cursor = crud.carregadados(); String[] nomecampos = new String[] {Banco.ID, Banco.TITULO; int[] idviews = new int[] {R.id.idLivro, R.id.nomeLivro; SimpleCursorAdapter adaptador = new SimpleCursorAdapter(getBaseContext(), R.layout.livros_layout,cursor,nomeCampos,idViews, 0); lista = (ListView)findViewById(R.id.listView); lista.setadapter(adaptador); lista.setonitemclicklistener(new AdapterView.OnItemClickListener() { @Override public void onitemclick(adapterview<?> parent, View view, int position, long id) { String codigo; cursor.movetoposition(position); codigo = cursor.getstring(cursor.getcolumnindexorthrow(banco.id)); Intent intent = new Intent(Activity_Consulta.this, Activity_Alterar.class); intent.putextra("codigo", codigo); startactivity(intent); finish(); );
Activity Consulta A classe SimpleCursorAdapter é utilizada como adaptador para que os dados contidos no cursor sejam devidamente exibidos na tela. Um array de Strings deve ser criado para armazenar os campos que deverão ser mostrados no ListView
Altera Dados
Classe CRUD Método alteradados Na classe CRUD vamos adicionar o método carregadados(int id) A diferença entre o método anterior carregadados() e este, é que agora passamos por parâmetro o id da tupla de dados que desejamos atualizar Outra diferença é que aqui são recuperados todos os campos dentro do array de Strings Uma String chamadawhere é declarada para armazenar a cláusula WHERE, que diz ao banco de dados para devolver apenas registros com o determinado id passado por parâmetro O código do método é apresentado no próximo slide e deve ser inserido na classe CRUD
Classe CRUD Método alteradados public Cursor carregadadobyid(int id){ Cursor cursor; String[] campos = {banco.id,banco.titulo,banco.autor,banco.editora; String where = Banco.ID + "=" + id; db = banco.getreadabledatabase(); cursor = db.query(banco.tabela,campos,where, null, null, null, null, null); if(cursor!=null){ cursor.movetofirst(); db.close(); return cursor;
Activity Alterar No próximo slide, apresento o código da Activity Consulta
public class Activity_Alterar extends AppCompatActivity { EditText livro, autor, editora; Button alterar; Cursor cursor; CRUD crud; String codigo; Activity Alterar @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_alterar); codigo = this.getintent().getstringextra("codigo"); crud = new BancoController(getBaseContext()); livro = (EditText)findViewById(R.id.editText4); autor = (EditText)findViewById(R.id.editText5); editora = (EditText)findViewById(R.id.editText6); alterar = (Button)findViewById(R.id.button2); cursor = crud.carregadadobyid(integer.parseint(codigo)); livro.settext(cursor.getstring(cursor.getcolumnindexorthrow(criabanco.titulo))); autor.settext(cursor.getstring(cursor.getcolumnindexorthrow(criabanco.autor))); editora.settext(cursor.getstring(cursor.getcolumnindexorthrow(criabanco.editora))); alterar.setonclicklistener(new View.OnClickListener() { @Override public void onclick(view v) { crud.alteraregistro(integer.parseint(codigo), livro.gettext().tostring(),autor.gettext().tostring(), editora.gettext().tostring()); Intent intent = new Intent(Alterar.this,Consulta.class); startactivity(intent); finish(); );
Classe CRUD Para os dados serem alterados precisamos implementar o método alteraregisto na classe CRUD do banco de dados O método pode ser observado no próximo slide
public void alteraregistro(int id, String titulo, String autor, String editora){ ContentValues valores; String where; db = banco.getwritabledatabase(); where = Banco.ID + "=" + id; valores = new ContentValues(); valores.put(banco.titulo, titulo); valores.put(banco.autor, autor); valores.put(banco.editora, editora); db.update(banco.tabela,valores,where,null); db.close();
Deleta Dados
Classe CRUD Método deletadados O método para remover um registro do banco é apresentado no próximo slide
Classe CRUD Método deletadados public void deletaregistro(int id){ String where = Banco.ID + "=" + id; db = banco.getreadabledatabase(); db.delete(banco.tabela,where,null); db.close();
Classe CRUD Método deletadados Veja que os dados do banco serão apenas apagados e não manipulados. O método deletereceberá o nome da tabela e a cláusula where.
Activity Altera Dados Vamos colocar o botão deletar na mesma activity responsável por alterar os dados. Acrescente o código a seguir no xml da activity de alterar dados <Button android:layout_width= match_parent" android:layout_height="wrap_content" android:text="deletar" android:id="@+id/button3" />
Activity Altera Dados No arquivo java, adicione o listener para o botão responsável por deletar dados
Activity Altera Dados deletar = (Button)findViewById(R.id.button3); deletar.setonclicklistener(new View.OnClickListener() { @Override public void onclick(view v) { crud.deletaregistro(integer.parseint(codigo)); Intent intent = new Intent(Alterar.this,Consulta.class); startactivity(intent); finish(); );
Atividade 5 Crie uma activity chamada Inicio, ela deverá ser a activity inicial do aplicativo Quando o aplicativo for carregado, ele apresenta três opções: Inserir Livro (será responsável por cadastrar livro no APP) Alterar Livro (será responsável por alterar cadastro de livro no APP) Remover Livro (será responsável por remover livro no APP) Modifique a função listar livros para que ordene os livros por nome (ordem crescente) No Android Studio, vá em File >> Export to zip file gere um arquivo zip e envie pelo site