Diego Rubin

Fullstack Developer

Entre em contato

Desenvolvimento para Android - Trabalhando com SQLite

Ereader icon

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&lt;JSONObject&gt; 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&lt;?&gt; 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

Novo Comentário

Comentários

cara não ta faltando uma classe ai?

LinguagemArrayAdapter.java

Olá,

o código completo do projeto pode ser encontrado no link do github que está na introdução do artigo.

Não listei esta classe neste artigo pois ela já foi comentada no anterior.

Peço desculpas por não deixar isso claro e agradeço o seu comenário.

Se alguém também tiver problemas em encontrar a classe que está faltando, segue os seguintes links:

https://github.com/diegorubin/blog/tree/master/SearchList -> Local onde o código completo pode ser encontrado;

http://diegorubin.com/2012/02/17/desenvolvimento-para-android-utilizando-uma-listview -> Artigo onde apresento a classe que não foi listada;

http://diegorubin.com/tag/carnandroid -> listagem dos quatro artigos que fazerm parte da construção deste exemplo.

Boa Tarde, para carregar uma foto da base dados SQLite não estou a conseguir. Pode-me ajudar?

Estou fazendo assim. aparece em branco a foto.

//FOTO

byte[] blob = cursos.getBlob(cursos.getColumnIndex(cursos.getColumnName(7)));

Bitmap bmp = BitmapFactory.decodeByteArray(blob, 0, blob.length);

foto = new ImageView(this);

foto = (ImageView) findViewById(R.id.imgfoto);

foto.setImageBitmap(bmp);

Olá, gostaria de saber como eu faço para recuperar o "_id" de uma tabela, visto

pelo tutorial, a primeira string é o retorno do "nome" "cursor.getString(0)". Para fazer um update na tabela, eu gostaria de fazer um search by _id, tem uma dica de como se faz?

Olá Marcus,

Para pegar o id de um registro e só adiciona-lo na criação do cursor:

Cursor cursor =

db.query("linguagens", new String[]{"id","nome", "descricao"},

null, /* buscaremos todas, nao precisamos de nenhuma condicao*/

null, null, null, "nome ASC" /*ordenando pelo nome*/);

Então neste caso ficaria cursor.getInt(0).

[]'s

Caramba Diego, agente estava com esse problema aqui na universidade de recuperar o id. Valeu mesmo, agora, COM O ID, dá para bolar um esquema de deletar um registro quando nos interessar.

Edit: aqui na universidade, com essa dica dada a dois comentários acima, CONSEGUIMOS criar um sistema de remoção de elementos inseridos por id.

Agora, tem como nos dar uma idéia para implementar chave estrangeira?

Olá Lécio,

O uso de chave estrangeira no SQLite para o Android é o mesmo que nos bancos de dados tradicionais.

Você pode utilizar o método rawQuery. É só dar uma olhada na documentação aqui: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

[]'s

Antonio Oliveira

Estou trabalhando com o SQLite já criei o banco, e uma tela de busca só sei carregar essa lista pra dentro da minha tela de busca é apenas o atributo nome que quero que seja lista abaixo do campo de pesquisa, se puder ajudar passo a passo agradeço é pra TCC.

Valeu Diego!

Muito obrigado por compartilhar este artigo!

Diego bom dia estou iniciando em android e seguindo exemplos de vários sites para entender cada linha, mas já segui o seu projeto duas vezes e não consegui rodar, fui efetuar o download mas os arquivos são separados tentei salvar cada um em sua estrutura, não tive exito será que não tem um único download fácil para importar Atenciosamente Eduardo

Oi Rodrigo, parabéns peo conteúdo que estou estudando ja com uma pergunta:

Como acessar estes dados remotamente ou executar estas mesmas consultas de outro app.

Por exemplo, uma app de ERP precisa sincronizar com um servidor central para disponibilizar os dados que serão processados por estes, enquanto gostaria que a logica de negocios consulte diretamente das pontas -as apks.

Abraço

muito bom o post

Guilherme Haynes

Cara, Eu fiz do jeito que ta no exemplo más quando eu executo o programa ele da erro, e o android ele para de funcionar o que posso fazer ?

Alfredo Ricardo Maleca

Gosteido artigo, agrdecia se possivel enviar-me para este emal: alfredomaleca55@gmail.com o manual completo que aborda sobre Programacao android com banco de dados passo a passo para iniciantes.