Desenvolvimento para Android - Trabalhando com SQLite

18 Feb 2012 . category: article . Comments
#mobile #java #desenvolvimento #android #carnandroid

Introdução

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.

Classe de criação do banco

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();
  }
}

Classe de conexão com o banco de dados

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;
  }
}

Alterando o Activity principal

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) {
            }
          }
          
        });
        
    }
}

Conclusão

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


Me

Tenho estudado esse mundo mágico da programação desde 2005. Já consegui sustentar minha família usando Ruby, Java, Python, C++ e Javascript. O resto tenho usado para diversão ou aprendizado.