sábado, 21 de abril de 2012

Android - Carregando ListView com SqLite


Olá Pessoal,

Hoje vou mostrar como carregar um ListView com informações vindas do SqLite, esse exemplo utiliza parte do código utilizado no exemplo de Agenda.

A seguir temos um print do projeto, para orientar onde devemos criar cada arquivo.

Para facilitar no aprendizado todos os fontes apresentados seguem com comentários, e abaixo segue todo o fonte utilizado.

Arquivo main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/btnInserir"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Inserir registros" 
        android:onClick="btnInserir_Click"/>

    <Button
        android:id="@+id/btnCarregar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Carregar registros"
        android:onClick="btnCarregar_Click" />

    <ListView
        android:id="@+id/listView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>


Arquivo row.xml
<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout 
 android:layout_width="fill_parent" 
 android:orientation="horizontal" 
 android:id="@+id/rowLayout" 
 android:layout_height="fill_parent" 
 xmlns:android="http://schemas.android.com/apk/res/android"> 

    
 <TextView 
     android:id="@+id/tvNome" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceMedium"
     android:text="Nome" 
     android:layout_alignParentLeft="true"/>

    <TextView
        android:id="@+id/tvEndereco"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/tvNome"
        android:gravity="right"
        android:text="Endereco" />

    <TextView
        android:id="@+id/tvTelefone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium" 
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/tvEndereco"
        android:text="Telefone"
        />

</RelativeLayout>


Arquivo BaseDAO.java
package br.com.EscolaDeAndroid.ListSqlite;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

//Classe responsável pela criação do Banco de Dados e tabelas
public class BaseDAO extends SQLiteOpenHelper {

    public static final String TBL_AGENDA = "agenda";
    public static final String AGENDA_ID = "_id";
    public static final String AGENDA_NOME = "nome";
    public static final String AGENDA_ENDERECO = "endereco";
    public static final String AGENDA_TELEFONE = "telefone";
    
    private static final String DATABASE_NAME = "agenda.db";
    private static final int DATABASE_VERSION = 1;
    
      //Estrutura da tabela Agenda (sql statement)
    private static final String CREATE_AGENDA = "create table " +
            TBL_AGENDA + "( " + AGENDA_ID       + " integer primary key autoincrement, " + 
                                  AGENDA_NOME     + " text not null, " +
                                  AGENDA_ENDERECO + " text not null, " +
                                  AGENDA_TELEFONE + " text not null);";

    public BaseDAO(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase database) {
        //Criação da tabela
        database.execSQL(CREATE_AGENDA);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //Caso seja necessário mudar a estrutura da tabela
        //deverá primeiro excluir a tabela e depois recriá-la
        db.execSQL("DROP TABLE IF EXISTS " + TBL_AGENDA);
        onCreate(db);
    }
}


Arquivo ListSqliteActivity.java
package br.com.EscolaDeAndroid.ListSqlite;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.CursorAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class ListSqliteActivity extends Activity {
    private SQLiteDatabase database;
    private CursorAdapter dataSource;
    
    //Atenção: é necessário inserir o PK (chave primária _id) como último campo
    private static final String campos[] = {"nome", "endereco", "telefone", "_id"};

    ListView listView;
    BaseDAO helper;
    
    /** Chamado quando a Activity é exeutada pela primeira vez. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        listView = (ListView) findViewById(R.id.listView1);
       
        //cria instância da classe BaseDAO, responsável pela criação do Banco de Dados 
        helper = new BaseDAO(this);
        
        //executa rotinas internas para abrir/utilizar o banco de dados
        database = helper.getWritableDatabase();
    }
    
    public void btnInserir_Click(View v){
        //insere dados no banco de dados
        database.execSQL("INSERT INTO agenda (nome, endereco, telefone) VALUES " +
                "('Escola de Android', 'R: João Figueiredo, 101', '(99)9999-9999')");
        
        database.execSQL("INSERT INTO agenda (nome, endereco, telefone) VALUES " +
                "('Projeto Teste', 'Av. Brasil, 500', '(12)3456-78901')");        
        
        Toast.makeText(this, "Registros inseridos com sucesso", Toast.LENGTH_SHORT).show();        
    }
    
    public void btnCarregar_Click(View v){
        //executa consulta geral de todos os registros cadastrados no banco de dados
        Cursor contatos = database.query("agenda", campos, null, null, null, null, null);

        if (contatos.getCount() > 0){
            //cria cursor que será exibido na tela, nele serão exibidos 
            //todos os contatos cadastrados
            dataSource = new SimpleCursorAdapter(this, R.layout.row, contatos, 
                    campos, new int[] { R.id.tvNome, R.id.tvEndereco , R.id.tvTelefone });
            
            //relaciona o dataSource ao próprio listview
            listView.setAdapter(dataSource);
        }else{
            Toast.makeText(this, "Nenhum registro encontrado", Toast.LENGTH_SHORT).show(); 
        }
    }

    //método executado quando o usuário clica no botão voltar do aparelho
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();

        //deleta registros inseridos, simplesmente para limpar essa base que é de teste
        database.execSQL("DELETE FROM AGENDA");        
        
        //fecha a conexão com o Banco de dados
        database.close();        
    }
}


Abaixo seguem as imagens do projeto em execução.


Para o programa funcionar é preciso primeiro clicar no botão "Inserir registros" com isso será exibida uma mensagem de "Registros incluídos com sucesso", em seguida deve ser clicado no botão
"Carregar registros" para ser exibido a lista dos dados inseridos no Banco de Dados SqLite.

Por enquanto é isso pessoal, espero que gostem e comentem, caso tenham alguma dúvida, crítica ou sugestão é só enviar.

Em breve estarei apresentando mais exemplos sobre SqLite.


Posts relacionados:
Criação de uma Agenda - http://escoladeandroid.blogspot.com.br/2012/02/android-criando-uma-agenda-de-contatos.html



Desenvolvi o jogo Circus Puzzle Free ele é um quebra-cabeça e está publicado no Android Market, agradeço a todos que baixarem, jogarem e comentarem.



Desenv com qualidade!

11 comentários:

Inpato disse...
Este comentário foi removido pelo autor.
Inpato disse...

TE AMOOOO!!!!

andersom disse...

Oi galera, fis o btnCarregar_Click();
que tem ai, mais não consigo mostrar os dados que tenho no banco, já fis um monte de tutorial mais nenhum em nenhum deles funcionou, auguem pode me dar uma ajuda?

Marcio de Souza disse...

Andersom,

Qual erro ocorre?

Alguns pontos que podem causar erros:
no arquivo main.xml existe o atributo click conforme exemplo:
android:onClick="btnCarregar_Click"

No arquivo ListSqliteActivity.java o método está exatamente igual ao atributo do arquivo xml, inclusive letras maiúsculas e minusculas:
public void btnCarregar_Click(View v)

Ou o erro é de banco de dados?

Obrigado pela visita.

Unknown disse...

Olá Marcio, consigo realizar este procedimento também com um adapter? grato!

Jessica Gomes disse...

Mas luiz como eu crio uma tabela com estados e paises
de modo que eu a selecionar um determinado país e um determinado estado, na outra tela me apareça as informações desse estado?

Por favor, faça um exemplo usando alguns estados brasileiros

Eu estarei usando spinner e não edit text

Como crio tabelas com estados e paises dentro de um banco de dados? Pode fazer um exemplo na resposta?
E como eu faço para a query filtrar os resultados??

Queria exemplo

Lucas Siqueira disse...

Olá Marcio de Souza, estava vendo aqui seus tutoriais, são muito bom mesmo cara. Precisava de uma ajuda, nesse tuturial que vc ensina sobre "Carregando ListView com SqLite" tentei de toda forma colocar um check para poder marcar a linha tipo:
---------------
NOME
[x] ENDERECO
TELEFONE
---------------
NOME
[x] ENDERECO
TELEFONE
---------------
NOME
[x] ENDERECO
TELEFONE
---------------

quero colocar um checkbox para cada grupo de 3 linhas que contem o nome, endereço e telefone...

Se possível entre em contato por favor:
email: lucas-siqueira@outlook.com

Marcos disse...

E se eu tiver 1000 nomes na agenda?
se exibir todos os dados pesará e muito.

Como faço para mostrar somente o(s) nome(s) que digitar?

Unknown disse...

Boa tarde a todos, primeiramente gostaria de parabenizar o Blog, esta ótimo, mas infelizmente toda vez que tento carregar o projeto para o emulador, nele esta sempre me retornando a seguinte mensagem de erro : "unfortunately myapp has stopped"
coincidentemente somente quando tendo rodar projeto que esteja vinculado com banco de dados, sou novo nessa area de desenvolvimento para android, alguem poderia me ajudar ?
desde de já agradeço a todos.

Unknown disse...
Este comentário foi removido pelo autor.
Unknown disse...

Amigos, querendo saber como fazer um upload de um arquivo .pdf para o sqlite e a leitura do mesmo. Desde já agradeço quem poder ajudar...