Este é o segundo artigo da série sobre desenvolvimento de aplicações para Android. Neste artigo quero abordar o uso SGBD SQLite. Apesar de suas limitações em ralação a outros SGBD’s, ele pode ser extremamente útil em pequenas aplicações.
Uma nova tag foi criada no repositório do blog e projeto inteiro pode ser encontrado no github.
O primeiro passo será a criação de uma classe que nos ajudará com a criação do banco de dados de nossa aplicação. Essa classe herdará de android.database.sqlite.SQLiteOpenHelper. Ela será responsável pela criação das tabelas e por popular com informações de exemplo. Iremos chamar essa classe de DatabaseHelper.
Arquivo: DatabaseHelper.java
package com.diegorubin.search_list;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
/*
* O construtor necessita do contexto da aplicação
*/
public DatabaseHelper(Context context) {
/* O primeiro argumento é o contexto da aplicacao
* O segundo argumento é o nome do banco de dados
* O terceiro é um pondeiro para manipulação de dados,
* não precisaremos dele.
* O quarto é a versão do banco de dados
*/
super(context, "linguagens.sqlite", null, 1);
}
/*
* Os métodos onCreate e onUpgrade precisam ser sobreescrito
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE linguagens(" +
"id INT AUTO_INCREMENT," +
"nome VARCHAR(100)," +
"descricao VARCHAR(200)," +
"primary key(id));");
ContentValues values = new ContentValues();
/*
* Inserindo os valores de exemplo em nosso
* banco de dados.
*
* É, estou sem muita imaginação :)
*/
values.put("nome", "Ruby");
values.put("descricao", "Sobre a linguagem Ruby");
db.insert("linguagens", null, values);
values.put("nome", "Python");
values.put("descricao", "Sobre a linguagem Python");
db.insert("linguagens", null, values);
values.put("nome", "Perl");
values.put("descricao", "Sobre a linguagem Perl");
db.insert("linguagens", null, values);
values.put("nome", "Lua");
values.put("descricao", "Sobre a linguagem Lua");
db.insert("linguagens", null, values);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
/*
* Estamos criando a primeira versão do nosso banco de dados,
* então não precisamos fazer nenhuma alteração neste método.
*
*/
}
public SQLiteDatabase getDatabase() {
return this.getWritableDatabase();
}
}
Tendo criado nosso banco, agora iremos criar uma classe contendo as métodos para buscar nossas informações no banco. O principal intuido da criação dessa classe é organizar nosso código. Todas as manipulações da tabela ficarão nesta classe.
A classe se chamará LinguagemDataSource.
Arquivo: LinguagemDataSource.java
package com.diegorubin.search_list;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class LinguagemDataSource {
private SQLiteDatabase db;
private DatabaseHelper helper;
public LinguagemDataSource(Context context) {
helper = new DatabaseHelper(context);
db = helper.getDatabase();
}
/*
* Recuperando todas a linguagens cadastradas no nosso
* banco de dados.
* Iremos retorna-los em List<JSONObject>, pois é o
* formato que o nosso adapter espera.
*/
public List<JSONObject> allLinguagens() {
List<JSONObject> result = new ArrayList<JSONObject>();
// Iremos buscar todas as linguagens cadastradas no banco
// As colunas que iremos selecionar serão nome e descricao
// O objeto de retorno contém a referencias das linhas retornadas
Cursor cursor =
db.query("linguagens", new String[]{"nome", "descricao"},
null, /* buscaremos todas, nao precisamos de nenhuma condicao*/
null, null, null, "nome ASC" /*ordenando pelo nome*/);
cursor.moveToFirst();
while(!cursor.isAfterLast()) {
JSONObject obj = new JSONObject();
try{
// As colunas são recuperadas na ordem que foram selecionadas
obj.put("nome", cursor.getString(0));
obj.put("descricao",cursor.getString(1));
}catch (JSONException e) {
}
result.add(obj);
cursor.moveToNext();
}
cursor.close();
return result;
}
}
O ultimo passo será alterar a fonte de dados de nosso exemplo anterior. Agora as informações que popularam a ListView irão vir do nosso banco de dados. O SearchListActivity após a alteração está logo abaixo.
Arquivo: SearchListActivity.java
package com.diegorubin.search_list;
import java.util.List;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Toast;
public class SearchListActivity extends Activity {
private ListView lstLinguagens;
private List<JSONObject> linguagens;
private LinguagemArrayAdapter adapter;
private LinguagemDataSource source;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
source = new LinguagemDataSource(getApplicationContext());
// Recupera do banco as informações que serão uitlizados em nosso adapter
linguagens = source.allLinguagens();
// Passamos a lista de exemplo para gerar nosso adpater
adapter = new LinguagemArrayAdapter(getApplicationContext(), R.layout.linguagem, linguagens);
// Buscando o elemento Listview da nossa interface principal interface
lstLinguagens = (ListView) findViewById(R.id.lstLinguagens);
// Setando o adapter em nossa ListView
lstLinguagens.setAdapter(adapter);
// Setando callback ao selecionar um item da lista
lstLinguagens.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
try{
JSONObject linguagem = linguagens.get(position);
String descricao = linguagem.getString("descricao");
Toast.makeText(getApplicationContext(), descricao, 10000).show();
}catch (JSONException e) {
}
}
});
}
}
No próximo artigo quero escrever um pouco sobre como carregar um banco de dados criado externamente em nossas aplicações.
Mais uma vez quero deixar-lhes a vontade para tirarem eventuais dúvidas sobre as informações passadas neste artigo. Os comentários do post estão ai para isso.
[]’s