Olá! Nesse post vamos fazer um app com persistêcia de dados usando Ormlite. Ormlite é uma biblioteca que tem a função de ser fazer encapsular a persistencia tornando possível tratarmos dados relacionais como objetos, para quem já trabalha com Hibernate podemos dizer que é uma versão bem light (similar).
Para mais informações acesse: http://ormlite.com/. Nesse link também pode ser baixada os arquivos .jar para serem colocados na pasta lib de seu projeto.
Bem vamos começar com a classe pessoa que além de representar o objeto também representa a tabela no banco de dados:
package com.example.ormliteexemplo;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
//anotação que indica que a classe representa uma tabela no bd
@DatabaseTable
public class Pessoa {
//anotação que indica que o atributo é um campo no bd de id auto increment
@DatabaseField(generatedId = true)
private Integer id;
//anotação que indica que o atributo é um campo no bd
@DatabaseField
private String nome;
//anotação que indica que o atributo é um campo no bd
@DatabaseField
private Integer idade;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public Integer getIdade() {
return idade;
}
public void setIdade(Integer idade) {
this.idade = idade;
}
@Override
public String toString() {
return "Pessoa [nome = " + nome + ", idade = " + idade + "]";
}
}
Vamos precisar também de uma classe utilitária responsável por gerenciar as conexões com o banco de dados:
package com.example.ormliteexemplo;
import java.sql.SQLException;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
//classe utilitaria responsavel pela criação do banco fornecimento de conexoes com bd
public class DataBaseUtil extends OrmLiteSqliteOpenHelper {
private static final String DATABASE_NAME = "ihomecare.db";
private static final int DATABASE_VERSION = 1;
public DataBaseUtil(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
public static ConnectionSource getConnectionSource(Context context) {
return new DataBaseUtil(context).getConnectionSource();
}
// metodo responsavel pela criacao das tabelas
@Override
public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
try {
TableUtils.createTable(connectionSource, Pessoa.class);
} catch (SQLException e) {
e.printStackTrace();
}
}
// metodo responsavel pelos drops tables
@Override
public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource,
int oldDbVersion, int newDbVersion) {
try {
TableUtils.dropTable(connectionSource, Pessoa.class, true);
onCreate(db, connectionSource);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Agora o xml do laytout:
<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="wrap_content"
android:orientation="vertical"
tools:context=".MainActivity" >
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</LinearLayout>
</ScrollView>
<TextView
android:id="@+id/tvNome"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#000000"
android:padding="15dp"
android:text="Nome"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="#FFFFFF" />
<EditText
android:id="@+id/etNome"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:hint="Insira o nome aqui"
android:inputType="textPersonName"
android:textColor="#000000"
android:textColorHint="#BEBEBE" >
<requestFocus />
</EditText>
<TextView
android:id="@+id/tvIdade"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#000000"
android:padding="15dp"
android:text="Idade"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="#FFFFFF" />
<EditText
android:id="@+id/etIdade"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:hint="Insira a idade aqui"
android:inputType="number"
android:textColor="#000000"
android:textColorHint="#BEBEBE" >
</EditText>
<Button
android:id="@+id/btGravar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="15dp"
android:text="Gravar" />
<Button
android:id="@+id/btVer"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="15dp"
android:text="Ver pessoas gravadas" />
</LinearLayout>
e finalmente a nossa Acitivity:
package com.example.ormliteexemplo;
import java.sql.SQLException;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.dao.DaoManager;
import com.j256.ormlite.support.ConnectionSource;
public class MainActivity extends Activity {
private EditText etNome, etIdade;
private Button btGravar, btVer;
//metodo que retorna uma conexao com o bd
private ConnectionSource getConnectionSource(){
return new DataBaseUtil(MainActivity.this).getConnectionSource();
}
//metodo que retorna um dao do tipo Pessoa
//recebe o tipo e o tipo da pk
private Dao<Pessoa, Integer> getPessoaDao() throws SQLException{
Dao<Pessoa, Integer> dao = DaoManager.createDao(getConnectionSource(), Pessoa.class);
return dao;
}
//metodo que instancia os componentes de tela
private void instantiateViews(){
etNome = (EditText) findViewById(R.id.etNome);
etIdade = (EditText) findViewById(R.id.etIdade);
btGravar = (Button) findViewById(R.id.btGravar);
btVer = (Button) findViewById(R.id.btVer);
}
//metodo que checa os campos vazios
private String checkFields(){
StringBuilder sb = new StringBuilder("");
if (etNome.toString().length() < 1 || etIdade.toString().length() < 1){
sb.append("nPreencha os campos corretamente");
}
return sb.toString();
}
//metodo que sera chamado ao gravar os dados
private boolean gravar() throws SQLException{
int x = 0;
if (checkFields().equals("")){
Pessoa pessoa = new Pessoa();
pessoa.setNome(etNome.getText().toString());
pessoa.setIdade(Integer.parseInt(etIdade.getText().toString()));
//create é o insert do objeto no bd, retorna a qtd de linhas inseridas
x = getPessoaDao().create(pessoa);
}else{
showDialog("Erro", checkFields(), "OK");
}
return x > 0;
}
//metodo chamado para mostrar as pessoas gravadas no bd
private void showPessoas(){
List<Pessoa> pessoas = null;
try {
pessoas = getPessoaDao().queryForAll();
} catch (SQLException e) {
showDialog("Erro", "Detalhes:n" + e.getMessage() , "OK");
e.printStackTrace();
}
if (pessoas != null && pessoas.size() > 0){
for (int i = 0; i < pessoas.size(); i++){
Toast toast = Toast.makeText(MainActivity.this, pessoas.get(i).toString(), Toast.LENGTH_SHORT);
toast.show();
}
}else{
Toast toast = Toast.makeText(MainActivity.this, "Nenhuma pessoa gravado no banco", Toast.LENGTH_LONG);
toast.show();
}
}
//metodo auxiliar para mostrar uma caixa de dialogo
private void showDialog(String title, String message, String positive) {
AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
dialog.setMessage(message);
dialog.setPositiveButton(positive,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface di, int arg) {
}
});
dialog.setTitle(title);
dialog.show();
}
//adicionando ações aos botoes
private void addButtonsLinsteners(){
btGravar.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
try {
if(gravar()){
showDialog("Aviso", "Dados gravados com sucesso!", "OK");
}else{
showDialog("Erro", "Dados não foram gravados!", "OK");
}
} catch (SQLException e) {
showDialog("Erro", "Dados não foram gravados! Detalhes:n" + e.getMessage() , "OK");
e.printStackTrace();
}
}
});
btVer.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
showPessoas();
}
});
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
instantiateViews();
addButtonsLinsteners();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
Abaixo segue o link para download do projeto completo. Até +
https://github.com/juliocnsouzadev/android_exemples/tree/master/OrmliteExemplo
Vamos agora montar a tela inicial de nosso app, que será uma lista com imagem e texto do item do menu. Primeiramente vamos ao xml main já criado automaticamente quando criamos nosso projeto: More »
Vamos agora trabalhar com as classes responsáveis pela persistência dos dados em nossa aplicação. Primeiramente vamos criar uma classe auxiliar do banco de dados: More »
