Prévia do material em texto
UNIVERSIDADE VEIGA DE ALMEIDA
Rio de Janeiro - RJ
2024
DANIEL ESCOVINO COELHO
PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS
AVA 2 - Desenvolvimento de um aplicativo com a persistência de dados com o uso
do SQLite no Android
ENUNCIADO:
Desenvolvimento de um aplicativo com a persistência de dados com o uso do
SQLite no Android
A persistência é um recurso muito importante no desenvolvimento de aplicativos.
Saber trabalhar com os diversos tipos de armazenamento permite que você
desenvolva projetos mais robustos. O desenvolvimento de projetos com uso de
banco de dados, seja local ou remoto, é um pré-requisito para o desenvolvimento de
aplicativos modernos.
Para a concretização dos conhecimentos obtidos nesta unidade, você deve definir
um objeto para a criação de sua classe e desenvolver um projeto com uso de
persistência de dados com uso do SQLite no Android para realizar a manutenção
dos diferentes registros de armazenamento, com a listagem, inclusão, alteração e
exclusão desses registros.
Crie um aplicativo Android para trabalhar com uma base de dados com uma tabela
para persistência de dados de um objeto escolhido por você.
O objeto deve ser definido por meio de uma classe própria, com:
• O mínimo de cinco atributos (com uso de três diferentes tipos de dados) mais
o atributo id (long).
• Pelo menos um método construtor.
• Métodos de acesso (setters & getters) para todos os atributos.
• Outros métodos que sejam necessários.
A aplicação deverá tratar a inclusão, alteração e exclusão dos registros, além de
tratar o acesso, abertura e fechamento do recurso do banco de dados do SQLite,
com o uso da arquitetura em três camadas.
O aplicativo deverá apresentar os dados dos objetos armazenados por meio de uma
lista (ListView) e apresentar as funcionalidades de inclusão, exclusão e alteração,
que podem ser realizadas de acordo com a sua escolha.
Você pode montar as telas a seu critério, desde que atenda aos requisitos de
listagem, inclusão, exclusão e alteração dos registros.
Procedimentos para elaboração do TD
Crie um projeto no Android Studio e desenvolva a aplicação. Prepare um documento
do Word com uma capa (apresentado a instituição, o curso, a disciplina, o aluno e o
professor); a introdução do trabalho; o conteúdo com a documentação do sistema,
contendo a captura das telas e os códigos de desenvolvimento das telas (código
XML da view); os códigos de programação de todas as classes com comentários e
apresentação dos testes realizados com o aplicativo com as capturas das telas dos
testes; a conclusão e a bibliografia do trabalho.
Realize o envio da tarefa incluindo o arquivo do Word.
Desenvolvimento:
Código XML da View:
• activity_cadastro_servico.xml
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textIdade" />
• activity_listar_servico.xml
• item.xml
Código Java:
• Animal.java
package com.example.AVA2CadastroBanhoeTosa;
import java.io.Serializable;
// Classe modelo da entidade com seus respectivos métodos getters e setters
public class Animal implements Serializable {
private Long id;
private String servico, raca, nome, pelo;
private Short idade;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getServico() {
return servico;
}
public void setServico(String servico) {
this.servico = servico;
}
public String getRaca() {
return raca;
}
public void setRaca(String raca) {
this.raca = raca;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getPelo() {
return pelo;
}
public void setPelo(String pelo) {
this.pelo = pelo;
}
public Short getIdade() {
return idade;
}
public void setIdade(Short idade) {
this.idade = idade;
}
}
• ServicoAdapter.java
package com.example.AVA2CadastroBanhoeTosa;
import android.app.Activity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.List;
// Adaptador para exibir os dados da listagem de forma customizada para esta
aplicação, com nome, serviço, idade, raça e pelo de cada animal cadastrado.
public class ServicoAdapter extends BaseAdapter {
private List animais;
private Activity activity;
public ServicoAdapter(Activity activity, List animais) {
this.activity = activity;
this.animais =animais;
}
@Override
public int getCount() {
return animais.size();
}
@Override
public Object getItem(int i) {
return animais.get(i);
}
@Override
public long getItemId(int i) {
return animais.get(i).getId();
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
View v = activity.getLayoutInflater().inflate(R.layout.item, viewGroup,
false);
TextView servico = v.findViewById(R.id.txtServico);
TextView raca = v.findViewById(R.id.txtRaca);
TextView nome = v.findViewById(R.id.txtNome);
TextView pelo = v.findViewById(R.id.txtPelo);
TextView idade = v.findViewById(R.id.txtIdade);
Animal animal = animais.get(i);
servico.setText(animal.getServico());
raca.setText(animal.getRaca());
nome.setText(animal.getNome());
pelo.setText(animal.getPelo());
idade.setText(animal.getIdade().toString());
return v;
}
}
• ServicoDAO.java
package com.example.AVA2CadastroBanhoeTosa
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import java.util.ArrayList;
import java.util.List;
// Arquivo com os métodos de inse rção (inserir()), leitura, atualização
(atualizar()) e deletar (excluir()) dos dados no banco de dados.
public class ServicoDAO {
private Conexao conexao;
private SQLiteDatabase banco;
public ServicoDAO(Context context) {
conexao = new Conexao(context);
}
public void open() throws SQLException {
banco = conexao.getWritableDatabase();
}
public void close() {
conexao.close();
}
public long inserir(Animal animal) {
ContentValues values = new ContentValues();
values.put("servico", animal.getServico());
values.put("raca", animal.getRaca());
values.put("nome", animal.getNome());
values.put("pelo", animal.getPelo());
values.put("idade", animal.getIdade());
return banco.insert("animal", null, values);
}
public List obterTodos() {
List animais = new ArrayList();
Cursor cursor = banco.query("animal", new String[]{"id", " servico", "raca",
"nome", "pelo", "idade"},
null, null, null, null, null);
while(cursor.moveToNext()) {
Animal animal = new Animal();
animal.setId(cursor.getLong(0));
animal.setServico(cursor.getString(1));
animal.setRaca(cursor.getString(2));
animal.setNome(cursor.getString(3));
animal.setPelo(cursor.getString(4));
animal.setIdade(cursor.getShort(5));
animais.add(animal);
}
cursor.close();
return animais;
}
public void excluir(Animal animal) {
banco.delete("animal", "id = ?", new String[]{animal.getId().toString()});
}
public void atualizar(Animal animal) {
ContentValues values = new ContentValues();
values.put("servico", animal.getServico());
values.put("raca", animal.getRaca());
values.put("nome", animal.getNome());
values.put("pelo", animal.getPelo());
values.put("idade", animal.getIdade());
banco.update("animal", values,
"id = ?", new String[]{animal.getId().toString()});
}
}
• CadastroServicoActivity.java
package com.example.AVA2CadastroBanhoeTosa
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
// Atividade para retornar ao clicar em atualizar os dados de um animal ou ao
clicar no ícone de adicionar "+"
// no menu superior, para cadastrar um novo tipo de serviço.
public class CadastroServicoActivity extends AppCompatActivity {
private EditText servico, raca, nome, pelo, idade;
private ServicoDAO dao;
private Animal animal = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cadastro_servico);
servico = findViewById(R.id.editServico);
raca = findViewById(R.id.editRaca);
nome = findViewById(R.id.editNome);
pelo = findViewById(R.id.editPelo);
idade = findViewById(R.id.editIdade);
dao = new ServicoDAO(this);
Intent it = getIntent();
if(it.hasExtra("animal")) {
animal = (Animal) it.getSerializableExtra("animal");
servico.setText(animal.getServico());
raca.setText(animal.getRaca());
nome.setText(animal.getNome());
pelo.setText(animal.getPelo());
idade.setText(animal.getIdade().toString());
}
}
// Método que é chamado ao clicar no botão "Salvar" na tela após o
preenchimento dos dados do novo tipo de serviço ou na atualização de dados
// de um serviço já existente. Este método verifica qual desses casos é o
// atual e faz a ação de inserir ou atualizar no banco.
public void salvar(View view) {
if(animal == null) {
animal = new Animal();
animal.setServico(servico.getText().toString());
animal.setRaca(raca.getText().toString());
animal.setNome(nome.getText().toString());
animal.setPelo(pelo.getText().toString());
animal.setIdade(Short.parseShort(idade.getText().toString()));
dao.open();
long id = dao.inserir(animal);
dao.close();
Toast.makeText(this, "Serviço inserido com o id: " + id,
Toast.LENGTH_SHORT).show();
} else {
animal.setServico(servico.getText().toString());
animal.setRaca(raca.getText().toString());
animal.setNome(nome.getText().toString());
animal.setPelo(pelo.getText().toString());
animal.setIdade(Short.parseShort(idade.getText().toString()));
dao.open();
dao.atualizar(animal);
dao.close();
Toast.makeText(this, "Cadastro do serviço atualizado",
Toast.LENGTH_SHORT).show();
}
}
}
• ListarServicoActivity.java
package com.example.AVA2CadastroBanhoeTosa
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
// Atividade Principal, que é exibida ao abrir o app.
// Mostra a listagem com os serviços que foram cadastrados e suas
informações
public class ListarServicoActivity extends AppCompatActivity {
private ListView listView;
private ServicoDAO dao;
private List animais;
private List animaisFiltrados = new ArrayList();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listar_servico);
listView = findViewById((R.id.lista_animais));dao = new ServicoDAO(this);
dao.open();
animais = dao.obterTodos();
animaisFiltrados.addAll(animais);
ServicoAdapter adaptador = new ServicoAdapter(this, animaisFiltrados);
listView.setAdapter((adaptador));
registerForContextMenu(listView);
dao.close();
}
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater i = getMenuInflater();
i.inflate(R.menu.menu_principal, menu);
SearchView sv = (SearchView)
menu.findItem(R.id.app_bar_search).getActionView();
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String s) {
return false;
}
@Override
public boolean onQueryTextChange(String s) {
procuraAnimal(s);
return false;
}
});
return true;
}
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater i = getMenuInflater();
i.inflate(R.menu.menu_contexto, menu);
}
// Método para pesquisa pelo nome do animal cadastrado , ao clicar no ícone
de lupa
public void procuraAnimal(String nome)
{
animaisFiltrados.clear();
for(Animal a : animais) {
if(a.getNome().toLowerCase().contains(nome.toLowerCase())) {
animaisFiltrados.add(a);
}
}
listView.invalidateViews();
}
// Método que é executado ao pressionar em cima de um item da lista e
clicar na opção excluir.
public void excluir(MenuItem item) {
AdapterView.AdapterContextMenuInfo menuInfo =
(AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
final Animal servicoExcluir = animaisFiltrados.get(menuInfo.position);
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("Atenção!")
.setMessage("Realmente deseja excluir o serviço?")
.setNegativeButton("Não", null)
.setPositiveButton("Sim", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
animaisFiltrados.remove((servicoExcluir));
animais.remove(servicoExcluir);
dao.open();
dao.excluir(servicoExcluir);
dao.close();
listView.invalidateViews();
}
}).create();
dialog.show();
}
// Método que executa a atividade de cadastrar um serviço, para que o
usuário possa preencher os dados a ser registrado.
public void cadastrar(MenuItem item) {
Intent it = new Intent(this, CadastroServicoActivity.class);
startActivity(it);
}
// Método que é executado ao pressionar em cima de um item da lista e
clicar na opção atualizar.
// Os dados desse item que foi editado são passados para a activity
CadastrarServico, com isso sendo possível atualizar os dados desse animal
baseado no ID.
public void atualizar(MenuItem item) {
AdapterView.AdapterContextMenuInfo menuInfo =
(AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
final Animal animalAtualizar = animaisFiltrados.get(menuInfo.position);
Intent it = new Intent(this, CadastroServicoActivity.class);
it.putExtra("animal", animalAtualizar);
startActivity(it);
}
@Override
public void onResume() {
super.onResume();
dao.open();
animais = dao.obterTodos();
dao.close();
animaisFiltrados.clear();
animaisFiltrados.addAll(animais);
listView.invalidateViews();
}
}
• Conexao.java
package com.example.AVA2CadastroBanhoeTosa
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
// Atividade que cria conexão com o banco de dados SQLite
public class Conexao extends SQLiteOpenHelper {
private static final String name = "banco.db";
private static final int version = 1;
public Conexao(Context context) {
super(context, name, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table animal(id integer primary key autoincrement, " +
"servico char(20), raca varchar(30), nome varchar(50), pelo
varchar(10), idade integer(2))");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
Imagens da aplicação:
Conclusão do desenvolvimento:
A aplicação foi criada usando o Android Studio, com a linguagem de programação
Java e conexão ao banco de dados via SQLite, integrado ao Android Studio.
Aproveitamos diversos recursos avançados do Android Studio, que facilitam o
desenvolvimento, como a capacidade de arrastar os elementos diretamente para o
layout da tela e configurar seus atributos de forma ágil.
Bibliografia:
Criando uma app Android com banco de dados SQLite – LuizTools
Criando um CRUD com Android Studio e SQLite
Usar SQL para ler e gravar em um banco de dados (android.com)
Datatypes In SQLite
https://www.luiztools.com.br/post/criando-uma-app-android-com-banco-de-dados-sqlite/
https://www.devmedia.com.br/criando-um-crud-com-android-studio-e-sqlite/32815
https://developer.android.com/codelabs/basic-android-kotlin-compose-sql?hl=pt-br#0
https://www.sqlite.org/datatype3.html