Buscar

Android Studio Como criar um CRUD em Android com SQLite

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 34 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 34 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 34 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Marcar como lido Anotar
As plataformas Mobile vêm ganhando força nos últimos anos, muitas empresas têm
investido muito dinheiro para treinar e capacitar seus pro�ssionais e torna-los
capazes de desenvolver aplicativos para dispositivos móveis.
Neste artigo se mostrado como fazer um CRUD utilizando o sistema de banco de
dados interno do Android, o SQLite . A criação desse banco de dados será feita
diretamente com a SDK do Android e utilizaremos o Android Studio para a
criação dos exemplos.
 Aprenda mais sobre Android através do nosso Guia
SQLite no Android
Artigo
Criando um CRUD com Android Studio e
SQLite
Veja nesse artigo como criar um CRUD em Android simples utilizando o Android Studio e o banco
de dados nativo do Android, o SQLite.
51515151515151515151515151515151515151515151515151515151515151515151
Login
O SQLite é um banco de dados relacional open-source e fornece suporte
para comandos SQL.
Cada aplicação Android pode criar quantos bancos de dados desejar e eles
irão �car armazenados no sistema, mas vale lembrar que o banco de dados
criado pela aplicação não pode ser acessado nem visualizado por outra
aplicação, apenas pela que o criou.
 Saiba mais sobre o banco de dados SQLite
API de acesso
Para fazer o acesso ao banco de dados SQLite dentro da plataforma
Android iremos utilizar uma API de acesso, a qual já vem no pacote SDK.
Duas classes serão utilizadas para a criação do banco de dados via
aplicação e ambas podem ser vistas no código da Listagem 1:
1. SQLiteDatabase : Classe que contém os métodos de manipulação dos
dados no banco;
2. SQLiteOpenHelper : Classe responsável pela criação do banco e também
responsável pelo versionamento do mesmo.
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
  
/**
 * Created by allanromanato on 5/27/15.
 */
public class CriaBanco extends SQLiteOpenHelper {
 @Override
 public void onCreate(SQLiteDatabase db) {
  
 }
   51515151515151515151515151515151515151515151515151515151515151515151
Listagem 1. Criação de uma classe para criar o banco de dados
O código apresentado foi criado automaticamente pelo Android Studio e os
dois métodos foram prototipados. Ao estender sua classe SQLiteOpenHelper ,
o Android Studio obriga o desenvolvedor a implementar dois métodos que
são de suma importância para o correto funcionamento da criação do
banco de dados:
Método onCreate() : é chamado quando a aplicação cria o banco de
dados pela primeira vez. Nesse método devem ter todas as diretrizes
de criação e população inicial do banco.
Método onUpgrade() : é o método responsável por atualizar o banco de
dados com alguma informação estrutural que tenha sido alterada. Ele
sempre é chamado quando uma atualização é necessária, para não ter
nenhum tipo de inconsistência de dados entre o banco existente no
aparelho e o novo que a aplicação irá utilizar.
Ambos recebem como parâmetro o objeto db , que é uma instância da
classe SQLiteDatabase.
É notável também que o método onUpgrade() , além do objeto db , recebe
dois outros parâmetros, que são inteiros: um contém a versão antiga da
tabela e o outro contém a nova versão para ao qual o upgrade deve ser
executado.
Agora criaremos uma table de cadastro de livros, com os seguintes
campos: id, titulo, autor e editora.
 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
  
 }
}
51515151515151515151515151515151515151515151515151515151515151515151
O código da Listagem 2 contém o nome do banco e a versão, que é um
atributo importante e deve ser armazenado, pois com ela será possível
efetuar alterações ao banco de dados sem problemas futuros, além do
nome da tabela.
Listagem 2. Fragmento de código banco de dados
Na Listagem 3 temos o código de criação do banco, que segue o mesmo
padrão do JDBC, o qual permite que o desenvolvedor escreva comandos
SQL em seu código e posteriormente chama um método que executará esse
comando no banco, ou seja, o comando de criação da tabela deve ser
escrito no código.
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
  
/**
 * Created by allanromanato on 5/27/15.
 */
public class CriaBanco extends SQLiteOpenHelper {
 private static final String NOME_BANCO = "banco.db";
 private static final String TABELA = "livros";
 private static final String ID = "_id";
 private static final String TITULO = "titulo";
 private static final String AUTOR = "autor";
 private static final String EDITORA = “editora";
 private static final int VERSAO = 1;
  
 @Override
 public void onCreate(SQLiteDatabase db) {
  
 }
  
 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
  
 }
}
 CREATE TABLE livros (
 _id integer primary key autoincrement,
 titulo text, 51515151515151515151515151515151515151515151515151515151515151515151
Listagem 3. Comando SQL para criação de banco de dados
 Conheça os principais comandos SQL
Agora devemos pegar esse código e colocar dentro do método que irá criar
o banco de dados, como mostra a Listagem 4.
Listagem 4. Método onCreate() Implementado
 autor text,
 editora text
)
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteOpenHelper;
  
 /**
 * Created by allanromanato on 5/27/15.
 */
 public class CriaBanco extends SQLiteOpenHelper {
 private static final String NOME_BANCO = "banco.db";
 private static final String TABELA = "livros";
 private static final String ID = "_id";
 private static final String TITULO = "titulo";
 private static final String AUTOR = "autor";
 private static final String EDITORA = "editora";
 private static final int VERSAO = 1;
  
 @Override
 public void onCreate(SQLiteDatabase db) {
 String sql = "CREATE TABLE"+TABELA+"("
+ ID + " integer primary key autoincrement,"
+ TITULO + " text,"
+ AUTOR + " text,"
+ EDITORA + " text"
+")"; 
 db.execSQL(sql);
 }
  
 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersio
  
 }
 }
51515151515151515151515151515151515151515151515151515151515151515151
Na Listagem 5 temos o método onUpgrade() , que normalmente tem um
comando SQL que apaga a tabela, se ela existir, e posteriormente invoca o
método onCreate() para que recrie a tabela com as alterações feitas.
Listagem 5. Implementação do método onUpgrade()
Na Listagem 6 temos o construtor que passará para a super classe as
informações do local e versão do banco.
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteOpenHelper;
  
 /**
 * Created by allanromanato on 5/27/15.
 */
 public class CriaBanco extends SQLiteOpenHelper {
 private static final String NOME_BANCO = "banco.db";
 private static final String TABELA = "livros";
 private static final String ID = "_id";
 private static final String TITULO = "titulo";
 private static final String AUTOR = "autor";
 private static final String EDITORA = "editora";
 private static final int VERSAO = 1;
  
 @Override
 public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE"+TABELA+"("
+ ID + " integer primary key autoincrement,"
+ TITULO + " text,"
+ AUTOR + " text,"
+ EDITORA + " text"
+")"; 
 
 db.execSQL(sql);
 }
  
 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersio
 db.execSQL("DROP TABLE IF EXISTS" + TABELA);
 onCreate(db);
 }
 }
 import android.content.Context;
 import android.database.sqlite.SQLiteDatabase;51515151515151515151515151515151515151515151515151515151515151515151
Listagem 6. Código funcional para criar banco de dados
 Saiba mais sobre o Android Studio
CRUD - Inserção de dados
 import android.database.sqlite.SQLiteOpenHelper;
  
 /**
 * Created by allanromanato on 5/27/15.
 */
 public class CriaBanco extends SQLiteOpenHelper {
 private static final String NOME_BANCO = "banco.db";
 private static final String TABELA = "livros";
 private static final String ID = "_id";
 private static final String TITULO = "titulo";
 private static final String AUTOR = "autor";
 private static final String EDITORA = "editora";
 private static final int VERSAO = 1;
  
 public CriaBanco(Context context){
 super(context, NOME_BANCO,null,VERSAO);
 }
  
 @Override
 public void onCreate(SQLiteDatabase db) {
String sql = "CREATE TABLE"+TABELA+"("
+ ID + " integer primary key autoincrement,"
+ TITULO + " text,"
+ AUTOR + " text,"
+ EDITORA + " text"
+")"; 
 
 }
  
 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersio
 db.execSQL("DROP TABLE IF EXISTS" + TABELA);
 onCreate(db);
 }
 }
51515151515151515151515151515151515151515151515151515151515151515151
Na Listagem 7 será criado um layout no Android Studio onde o usuário irá
inserir as informações. O resultado pode ser conferido na Figura 1.
<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".
 android:id="@+id/Inser">
  
  
 <TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:textAppearance="?android:attr/textAppearanceMedium"
 android:text="Titulo:"
 android:id="@+id/textView"
 android:layout_marginTop="47dp"
 android:layout_alignParentTop="true"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true" />
  
 <EditText
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/editText"
 android:layout_below="@+id/textView"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true"
 android:layout_alignParentRight="true"
 android:layout_alignParentEnd="true" />
  
 <TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:textAppearance="?android:attr/textAppearanceMedium"
 android:text="Autor:"
 android:id="@+id/textView2"
 android:layout_below="@+id/editText"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true"
 android:layout_marginTop="51dp" />
  
 <EditText
 android:layout_width="wrap_content" 51515151515151515151515151515151515151515151515151515151515151515151
 android:layout_height="wrap_content"
 android:id="@+id/editText2"
 android:layout_below="@+id/textView2"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true"
 android:layout_alignRight="@+id/editText"
 android:layout_alignEnd="@+id/editText" />
  
 <TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:textAppearance="?android:attr/textAppearanceMedium"
 android:text="Editora:"
 android:id="@+id/textView3"
 android:layout_below="@+id/editText2"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true"
 android:layout_marginTop="64dp" />
  
 <EditText
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/editText3"
 android:layout_below="@+id/textView3"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true"
 android:layout_alignRight="@+id/editText2"
 android:layout_alignEnd="@+id/editText2" />
  
 <Button
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="Cadastrar"
 android:id="@+id/button"
 android:layout_below="@+id/editText3"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true"
 android:layout_marginTop="72dp"
 android:layout_alignRight="@+id/editText3"
 android:layout_alignEnd="@+id/editText3" />
  
 <TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:textAppearance="?android:attr/textAppearanceMedium"
 android:id="@+id/textView4"
 android:layout_alignParentBottom="true"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true" />
  
</RelativeLayout>
51515151515151515151515151515151515151515151515151515151515151515151
Listagem 7. Código XML do layout do Insert
 
Figura 1. Layout de cadastro
O código apresentado ainda não possui funcionalidade nenhuma, pois não
foi programado dentro da Activity que o controlará.
Para facilitar o entendimento do código, ele será separado em duas classes:
a classe que estende a Activity, responsável por controlar a UI, e a classe
que será responsável por controlar as operações ao banco de dados.
A classe BancoController será responsável por controlar as manipulações
ao banco, como mostra a Listagem 8.
public class BancoController {
  
 private SQLiteDatabase db;
 private CriaBanco banco;
51515151515151515151515151515151515151515151515151515151515151515151
Listagem 8. Código responsável por inserir dados
Veja que criamos um construtor público e instanciamos o atributo banco e
o contexto que é passado por parâmetro a Activity.
É importante lembrar que o atributo db deve receber o resultado do
método getWritableDatabase , que diz ao Android que o banco será utilizado
para leitura e escrita de dados.
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 no formato key/value . Além disso, temos a classe
ContentValues para criar esse map. Lembre-se sempre de encerrar a
conexão ao �nal de uma operação.
  
 public BancoController(Context context){
 banco = new CriaBanco(context);
 }
  
 public String insereDado(String titulo, String autor, String editora){
 ContentValues valores;
 long resultado;
  
 db = banco.getWritableDatabase();
 valores = new ContentValues();
 valores.put(CriaBanco.TITULO, titulo);
 valores.put(CriaBanco.AUTOR, autor);
 valores.put(CriaBanco.EDITORA, editora);
  
 resultado = db.insert(CriaBanco.TABELA, null, valores);
 db.close();
  
 if (resultado ==-1)
 return "Erro ao inserir registro";
 else
 return "Registro Inserido com sucesso”;
  
 }
}
51515151515151515151515151515151515151515151515151515151515151515151
A Listagem 9 mostra a Activity que controla a UI criada anteriormente e faz
a chamada a esse método que insere o registro ao banco de dados.
Listagem 9. Activity de Inserir Dado
Veja que será capturado o conteúdo dos EditTexts e convertido para String.
Além disso, o método insereDado passa por parâmetro as informações a
serem adicionadas no bancoe, por �m, com o resultado retornado do
método, será exibida uma mensagem (Toast) na tela mostrando se a
operação foi um sucesso ou não.
public class InsereDado extends Activity {
  
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_inicial);
  
 Button botao = (Button)findViewById(R.id.button);
  
 botao.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 BancoController crud = new BancoController(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.insereDado(tituloString,autorString,editora
  
 Toast.makeText(getApplicationContext(), resultado, Toast.LEN
 }
 });
 }
}
51515151515151515151515151515151515151515151515151515151515151515151
CRUD - Consulta aos dados
Para realizar a consulta aos dados precisamos criar a interface, onde
teremos um ListView e um arquivo de XML de layout para “estilizar" este,
como mostra a Listagem 10. O resultado pode ser conferido na Figura 2.
Listagem 10. Código da UI de consulta contendo ListView
 
<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 android:paddingBottom="@dimen/activity_vertical_margin"
 tools:context="br.com.home.bancodedados.Consulta">
  
  
 <ListView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/listView"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true" />
</RelativeLayout>
51515151515151515151515151515151515151515151515151515151515151515151
Figura 2. ListView
Na Listagem 11 temos o código do listview estilizado, onde o ID aparece do
lado esquerdo da tela e o titulo do Livro do lado direito.
Listagem 11. Continuação da UI
O GridLayout foi utilizado nesse exemplo apenas para mostrar os itens
pesquisados separadamente na tela.
A Listagem 12 mostra como é executada a operação de consulta de todos
os dados no banco.
<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>
import android.content.ContentValues;
import android.database.Cursor;
51515151515151515151515151515151515151515151515151515151515151515151
Listagem 12. Código de consulta ao Banco de Dados
É visível que o código para se carregar todos os dados também não utiliza
nenhum comando SQL. Veja que são de�nidos os campos que a consulta
retornará no array de Strings campo, depois o objeto db recebe o retorno
do método getReadableDatabase que irá fazer com que os dados sejam
acessados como somente para leitura. Após essa operação, o método query
é chamado e o nome da tabela e os campos desejados para o retorno são
passados por parâmetro, e esse método retorna um Cursor , uma classe do
Android que salva as informações que são retornadas do banco de dados.
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.
Agora precisamos tratar as informações exibidas para o usuário dentro do 
ListView estilizado que foi criado anteriormente. Uma novidade é a classe 
import android.database.sqlite.SQLiteDatabase;
import android.content.Context;
  
/**
 * Created by allanromanato on 5/28/15.
 */
public class BancoController {
  
//Outros códigos…
  
public Cursor carregaDados(){
 Cursor cursor;
 String[] campos = {banco.ID,banco.TITULO};
 db = banco.getReadableDatabase();
 cursor = db.query(banco.TABELA, campos, null, null, null, null, 
  
 if(cursor!=null){
 cursor.moveToFirst();
 }
 db.close();
 return cursor;
 }
}
51515151515151515151515151515151515151515151515151515151515151515151
SimpleCursorAdapter que será utilizada como adaptador para que os dados
contidos no cursor sejam devidamente exibidos na tela. A Listagem 13
mostra como os dados serão colocados na tela utilizando essa classe.
Listagem 13. Código para mostrar os dados
O código irá instanciar a classe que faz o controle do banco de dados
passando o contexto atual, que será carregado para dentro de um objeto do
tipo Cursor com todos os dados recuperados do banco. Um array de Strings
deve ser criado para armazenar os campos que deverão ser mostrados no 
ListView e juntamente um array de inteiros para armazenar o ID dos
componentes que exibirão os dados.
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.AdapterView;
import android.widget.SimpleCursorAdapter;
  
  
public class Consulta extends Activity {
 private ListView lista;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_consulta);
  
 BancoController crud = new BancoController(getBaseContext());
 Cursor cursor = crud.carregaDados();
  
 String[] nomeCampos = new String[] {CriaBanco.ID, CriaBanco.TITULO};
 int[] idViews = new int[] {R.id.idLivro, R.id.nomeLivro};
  
 SimpleCursorAdapter adaptador = new SimpleCursorAdapter(getBaseConte
 R.layout.livros_layout,cursor,nomeCampos,idViews, 0);
 lista = (ListView)findViewById(R.id.listView);
 lista.setAdapter(adaptador);
 }
}
51515151515151515151515151515151515151515151515151515151515151515151
No trecho onde o SimpleCursorAdapter é instanciado, vale uma atenção
especial, pois é onde se “amarram" todas as informações: o layout onde
está de�nido o estilo (nesse exemplo o GridLayout ), o cursor que contém os
dados, o array de Strings com o nome dos campos, o id dos componentes
que serão utilizados para exibir o conteúdo e uma �ag. Após concluído o
processo, a lista deve ser amarrada com seu componente ListView e o
adapter deve ser setado nessa lista. A Figura 3 mostra a tela com as
informações carregadas do banco de dados.
 
Figura 3. Resultado da execução
CRUD - Alteração dos dados
Para se alterar os dados contidos em um banco, devemos recuperar uma
informação única de cada um deles e utilizá-la como uma referência para
as demais.Primeiramente o código do layout será mostrado na Listagem
14. Percebe-se que o código é muito parecido com o layout de Inclusão de
dados, mudando apenas alguns nomes de exibição.
Na Figura 4 podemos conferir o resultado.
51515151515151515151515151515151515151515151515151515151515151515151
<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".
 android:id="@+id/Alter">
  
  
 <TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:textAppearance="?android:attr/textAppearanceMedium"
 android:text="Titulo:"
 android:id="@+id/textView4"
 android:layout_alignParentTop="true"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true"
 android:layout_marginTop="75dp" />
  
 <EditText
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/editText4"
 android:layout_below="@+id/textView4"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true"
 android:layout_alignParentRight="true"
 android:layout_alignParentEnd="true" />
  
 <TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:textAppearance="?android:attr/textAppearanceMedium"
 android:text="Autor:"
 android:id="@+id/textView5"
 android:layout_below="@+id/editText4"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true"
 android:layout_marginTop="45dp" />
  
 <EditText
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/editText5"
 android:layout_below="@+id/textView5"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true" 51515151515151515151515151515151515151515151515151515151515151515151
Listagem 14. Layout de Alteração
 android:layout_alignRight="@+id/editText4"
 android:layout_alignEnd="@+id/editText4" />
  
 <TextView
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:textAppearance="?android:attr/textAppearanceMedium"
 android:text="Editora:"
 android:id="@+id/textView6"
 android:layout_below="@+id/editText5"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true"
 android:layout_marginTop="39dp" />
  
 <EditText
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:id="@+id/editText6"
 android:layout_below="@+id/textView6"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true"
 android:layout_alignParentRight="true"
 android:layout_alignParentEnd="true" />
  
 <Button
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="Alterar"
 android:id="@+id/button2"
 android:layout_below="@+id/editText6"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true"
 android:layout_marginTop="51dp"
 android:layout_alignRight="@+id/editText6"
 android:layout_alignEnd="@+id/editText6" />
</RelativeLayout>
51515151515151515151515151515151515151515151515151515151515151515151
 
Figura 4. Layout de Alteração
Existem várias formas de se chegar nessa tela, mas a adotada nesse artigo é
o clique na informação desejada no ListView de consulta, onde direcionará
todas as informações para essa tela. A Listagem 15 mostra apenas o código
que deve ser adicionado ao código da Listagem 13 após 
lista.setAdapter (adaptador);
Listagem 15. Complemento a Listagem 13
Ao ser clicado, o conteúdo do cursor para a primeira posição captura o
código que está contido dentro do cursor referenciado por CriaBanco.ID , e
esse código é passado via Intent para a activity que será estudada agora.
lista.setOnItemClickListener(new AdapterView.OnItemClickListener() {
 @Override
 public void onItemClick(AdapterView<?> parent, View view, int po
 String codigo;
 cursor.moveToPosition(position);
 codigo = cursor.getString(cursor.getColumnIndexOrThrow(CriaB
 Intent intent = new Intent(Consulta.this, Alterar.class);
 intent.putExtra("codigo", codigo);
 startActivity(intent);
 finish();
 }
 });
51515151515151515151515151515151515151515151515151515151515151515151
Após a passagem do código de referência das informações contidas no
banco de dados, é necessário que seja executada uma consulta ao banco e a
informação seja recuperada e armazenada em um objeto do tipo Cursor . A
Listagem 16 mostra como isso será feito.
Listagem 16. Código para carregar informação especi�ca
Aqui pode se notar uma diferença em relação ao código de recuperação de
dados, pois aqui são recuperados todos os campos dentro do array de
Strings. Um atributo do tipo String é declarado para armazenar a cláusula 
WHERE, que diz ao banco de dados para devolver apenas registros com o
determinado id passado por parâmetro. A query é executada passando
agora como parâmetro a condição para que as informações sejam
recuperadas.
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.content.Context;
  
/**
 * Created by allanromanato on 5/28/15.
 */
public class BancoController {
  
 //Outros códigos…
public Cursor carregaDadoById(int id){
 Cursor cursor;
 String[] campos = {banco.ID,banco.TITULO,banco.AUTOR,banco.EDITORA}
 String where = CriaBanco.ID + "=" + id;
 db = banco.getReadableDatabase();
 cursor = db.query(CriaBanco.TABELA,campos,where, null, null, null, n
  
 if(cursor!=null){
 cursor.moveToFirst();
 }
 db.close();
 return cursor;
 }
}
51515151515151515151515151515151515151515151515151515151515151515151
A Listagem 17 mostra claramente como a exibição na tela acontecerá.
Listagem 17. Exibir dado na tela
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
  
  
public class Alterar extends Activity {
 EditText livro;
 EditText autor;
 EditText editora;
 Button alterar;
 Button deletar;
 Cursor cursor;
 BancoController crud;
 String codigo;
  
 @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(CriaBanc
 autor.setText(cursor.getString(cursor.getColumnIndexOrThrow(CriaBanceditora.setText(cursor.getString(cursor.getColumnIndexOrThrow(CriaBa
  
 }
}
51515151515151515151515151515151515151515151515151515151515151515151
Veja que é recuperado o código passado pela Intent que chamou e instancia
o objeto responsável por manipular o banco de dados, iniciando os objetos
de tela. Logo após ele irá carregar os dados utilizando o método do
controle carregaDadosById > passando o código como parâmetro. Os
componentes de tela (livro, autor e editora) recebem o dado a partir da
leitura das informações contidas no cursor.
Para os dados serem alterados precisamos implementar o método 
alteraRegisto no controller do banco de dados, como mostra a Listagem 18.
Listagem 18. Altera Registro no Banco de dados
Na Listagem 19 temos o comando para chamar o método update.
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.content.Context;
  
/**
 * Created by allanromanato on 5/28/15.
 */
public class BancoController {
  
 //Outros códigos…
 public void alteraRegistro(int id, String titulo, String autor, String ed
 ContentValues valores;
 String where;
  
 db = banco.getWritableDatabase();
  
 where = CriaBanco.ID + "=" + id;
  
 valores = new ContentValues();
 valores.put(CriaBanco.TITULO, titulo);
 valores.put(CriaBanco.AUTOR, autor);
 valores.put(CriaBanco.EDITORA, editora);
  
 db.update(CriaBanco.TABELA,valores,where,null);
 db.close();
 }
}
51515151515151515151515151515151515151515151515151515151515151515151
Listagem 19. Chamar o método update
Esse código é um evento que chamará o método alteraRegistro e, logo após,
chamará a Activity responsável por exibir os dados na tela, con�rmando
assim se a informação foi alterada ou não.
CRUD - Deletando dados
Por conveniência, o deletar será utilizado juntamente com o alterar, na
mesma Activity, portanto para o componente de layout, insira o seguinte
código mostrado na Listagem 20 após o término do código da Listagem 14.
Listagem 20. Adicionando o botão Deletar
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();
 }
 });
<Button
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="Deletar"
 android:id="@+id/button3"
 android:layout_alignParentBottom="true"
 android:layout_alignParentLeft="true"
 android:layout_alignParentStart="true"
 android:layout_alignRight="@+id/button2"
 android:layout_alignEnd="@+id/button2" />
51515151515151515151515151515151515151515151515151515151515151515151
A Figura 5 mostra como o layout deverá �car após inserir o código XML.
 
Figura 5. Botão Deletar Inserido
A lógica utilizada para carregar os dados que serão deletados pelo usuário é
a mesma que a utilizada pelo alterar, por estarem na mesma activity.
A Listagem 21 mostra o método da classe de controle do banco responsável
por deletar o dado selecionado.
Listagem 21. Código que deleta os dados
Veja que os dados do banco serão apenas apagados e não manipulados. O
método delete receberá o nome da tabela e a cláusula where.
A Activity que controla a tela deve receber as diretivas responsáveis por
acionar o botão e chamar o método de deleção do dado. Referindo-se a
Listagem 18 deve-adicionar algumas linhas de código para que ela se
public void deletaRegistro(int id){
 String where = CriaBanco.ID + "=" + id;
 db = banco.getReadableDatabase();
 db.delete(CriaBanco.TABELA,where,null);
 db.close();
 }
51515151515151515151515151515151515151515151515151515151515151515151
adeque ao esperado. A Listagem 22 mostra os códigos necessários para
completar.
Listagem 22. Funcionalidade Delete
É muito parecido com o alterar, mas aqui o deletaRegistro é chamado ao
invés do alteraRegistro . Da mesma forma, a activity que mostra os dados na
tela é chamada para con�rmar a deleção.
Com isso, o CRUD está concluído, mas é claro que esses códigos podem ser
melhorados, adaptados e modi�cados segundo as necessidades do projeto.
Espero que tenho gostado desse artigo e até a próxima oportunidade.
 Aprenda mais sobre CRUD com SQLite no Android
Links
Android Studio 
http://developer.android.com/tools/studio/index.html
SQLite 
http://www.sqliteexpert.com/download.html
 //Código Antes
 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();
 }
});
51515151515151515151515151515151515151515151515151515151515151515151
 Curso relacionado: Criando uma loja virtual com Android Studio
 Curso relacionado: Primeiros passos com SQLite
 Curso relacionado: Curso de Android SDK
 Curso relacionado: Curso de Android
Marcar como lido Anotar
Por Allan
Em 2015
RECEBA NOSSAS NOVIDADES
Informe o seu e-mail
Receber Newsletter
Poste aqui sua dúvida ou comentário que nossa equipe responderá o mais rápido 
possível.
Suporte ao aluno - Deixe a sua dúvida.
51515151515151515151515151515151515151515151515151515151515151515151
Marcelo Lima
No método insereDado, não consegui acessar as variaveis estaticas "TITULO", "AUTOR" e
"EDITORA"... Só consegui acessar quando alterei na classe "CriaBanco" a visibilidade das variaveis
estaticas para public. Isso está correto?
há 1 mês
 
Jefferson Santos há 1 mês DEVMEDIA
Fala Marcelo, beleza? 
 
Legal tua dúvida, estamos acionando o nosso time de consultores para te ajudar. 
Em breve te daremos um retorno. 
 
[]' 
 
FABRICIO KAWATA há 1 mês DEVMEDIA
Olá Marcelo. Sim, você está correto, pois do contrário você não teria como acessar esses
atributos externamente à classe CriaBanco, conforme o exemplo propõe. Boa observação! 
 
Bons estudos e forte abraço!
 
Adicionar um comentário...
Daniel Silva
Eu consigo ter mais de 1 tabela? E a chamada da criação destas tabelas ficariam tudo nessa mesma
classe é isso?
há 2 meses
 
Jefferson Santos há 2 meses DEVMEDIA
Fala Daniel, blz? 
 
Para solucionar esse problema preciso direcionar seu chamado para um dos nossos
consultores. breve a gente te posiciona. Fechado? 
 
 
 
Daniel Silva há 2 meses
51515151515151515151515151515151515151515151515151515151515151515151
Ok, ainda no aguardo.
 
FABRICIO KAWATA há 2 meses DEVMEDIA
Oi Daniel. Isso mesmo, você ter 1 ou N tabelas, e seguir esse mesmo "padrão" apresentado.
Não há problemas quanto a isso. 
 
Abraço!
 
Adicionar um comentário...
Equipe Solution
Estou tomando erro com o insert, 
 
O erro é o seguinte: E/SQLiteLog: (1) table livro has no column named titulo. 
 
Já fiz de tudo e não esta funcionando. 
 
O que poderia ser? 
 
Fonte: 
 
 
db = banco.getWritableDatabase(); 
valores = new ContentValues(); 
valores.put(CriaBanco.TITULO, titulo); 
valores.put(CriaBanco.AUTOR, autor); 
valores.put(CriaBanco.EDITORA, editora); 
 
resultado = db.insert(CriaBanco.TABELA, null, valores);
há 10 meses
 
DIOGO SOUZA há 10 meses
Olá, tudo bem? 
 
Houve um erro na criação da tabela do post. Tenta o seguinte: 
 
String sql = "CREATETABLE"+TABELA+"(" 
+ ID + " integer primary key autoincrement," 
+ TITULO + " text," 
+ AUTOR + " text," 
+ EDITORA + " text" 
+")"; 
 
Põe um espaço em branco antes de cada " text" ou string de montagem da query.
51515151515151515151515151515151515151515151515151515151515151515151
 
Adicionar um comentário...
EVANDRO SILVA
Na consulta aos dados dizem que essa parte 
 
<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> 
 
é continuação da UI, mas não sei ao certo onde devo encaixar. 
 
É junto desse layout? 
 
<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" 
tools:context="br.com.home.bancodedados.Consulta"> 
 
 
<ListView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:id="@+id/listView" 
android:layout_alignParentLeft="true" 
android:layout_alignParentStart="true" /> 51515151515151515151515151515151515151515151515151515151515151515151
</RelativeLayout> 
 
No começo, no fim? Ou é um novo layout? Está parte fiquei um pouco confuso e estou enroscado
nela.
há +1 ano
 
Victor há +1 ano DEVMEDIA
Opa Evandro, beleza? 
Estamos trabalhando na sua dúvida, e em até 24hs úteis retornaremos com uma solução.
beleza? 
 
Um forte abraço.
 
Joel Rodrigues há +1 ano DEVMEDIA
Olá, Evandro. Tudo bem? 
 
Esse código deve ser inserido em um arquivo chamado livros_layout.xml. Ele representa o
layout dos itens do listview. Posteriormente, na Listagem 13, note que temos o seguinte
trecho de código no finalzinho: 
 
 SimpleCursorAdapter adaptador = new SimpleCursorAdapter(getBaseContext(), 
 R.layout.livros_layout,cursor,nomeCampos,idViews, 0); 
lista = (ListView)findViewById(R.id.listView); 
lista.setAdapter(adaptador); 
 
 
Nele estamos definindo um adapter para o listview que utilizará esse layout definido no
arquivo livros_layout.xml. Assim os itens serão mostrados com aquela aparência (id na
esquerda e título na direita). 
 
Qualquer dúvida, é só falar. 
 
Abraço.
 
Adicionar um comentário...
Nuno
Muito bom este tutorial, parabéns :) 
 
Boa tarde, gostaria de saber se é possível implementar uma search bar da listview com o código que
está acima.
há +1 ano
  51515151515151515151515151515151515151515151515151515151515151515151
Nuno há +1 ano
Conseguem ajudar? abraço a todos 
 
Douglas há +1 ano
Fala Nuno, 
 
Desculpe pela demora! Enviei essa questão para um dos consultores da DevMedia e logo
teremos um retorno. Ok? 
 
Um abraço.
 
Nuno há +1 ano
ok, obrigado. 
 
Um abraço.
 
Julio Sampaio há +1 ano
Olá Nuno, 
 
Fiz um exemplo pra você, pode baixar no seguinte link: 
 
https://dl.dropboxusercontent.com/u/5584352/MeusLivros.zip 
 
Quem faz a mágica é a classe MeusLivrosListAdapter.java 
 
Abraço!
 
Nuno há +1 ano
Obrigado, 
 
Abraço!
 
Douglas há +1 ano
:]
 
Adicionar um comentário...
51515151515151515151515151515151515151515151515151515151515151515151
Plataforma para Programadores
Comunidade
Revistas
Baixe o App
APIs
Fale conosco
Assinatura Empresarial
Hospedagem web por Porta 80 Web Hosting
UEDER CAETANO
Boa tarde, Allan. 
 
Me tire uma dúvida, eu tenho duas aplicações distintas AppXXX e o AppYYY cada uma com o seu
banco de dados. 
É possível de o AppXXX fazer uma consulta no banco de dados do AppYYY ? 
Se for possível como posso fazer isso ?
há +1 ano
 
[autor] Allan Romanato há +1 ano
Boa tarde, 
Essa eh uma pergunta muito boa, o android possui politicas de segurança para evitar esse
tipo de coisa, pois imagine se vc tem um banco com infos sigilosas e outra app acessa ele? 
Mas em contrapartida existem os content providers, de uma pesquisada sobre isso, acredito
que va gostar do que ler. 
 
Abs
 
Adicionar um comentário...
51515151515151515151515151515151515151515151515151515151515151515151
51515151515151515151515151515151515151515151515151515151515151515151

Outros materiais