domingo, 3 de fevereiro de 2013

Usando o SQLite no android

Olá comparsas,
Hoje vamos fazer uma pequena aplicação que faça uso do SQLite do Android, coisa rápida.
Eis os ingredientes:


  • Slackware 14 de 32 bits
  • JDK 1.6
  • Eclipse Juno 4.2
  • Google Plugin for Eclipse

Bacana né não? Comece indo neste link pra baixar o jdk. O Slack 14 não distribui mais o JDK "oficial" devido a uma mudança de política da Oracle (sempre ela...), embora o .SlackBuild exista no espelho do slack. Vamos pegar o jdk do 13.37, mas isso não é problema, não num Slackware, ;-)
Siga para a pasta onde estão seus downloads, abra um terminal lá e vire root; é hora de instalar o jdk:

sombriks@slack14:~$ cd ~/Downloads
sombriks@slack14:~/Downloads$ su
password: 
root@slack14:/home/sombriks/Downloads# installpkg jdk-6u25-i586-1.txz


Que maravilha. dê um ctrl+d, pra voltar a ser usuário normal. descompacte o eclipse que também está nesta pasta:
sombriks@slack14:~/Downloads$ tar xvf eclipse-java-juno-SR1-linux-gtk.tar.gz

Agora recarregue o /etc/profile (pois instalamos o jdk mas não recarregamos o environment do shell) e execute o eclipse em seguida:

sombriks@slack14:~/Downloads$ source /etc/profile
sombriks@slack14:~/Downloads$ ./eclipse/eclipse


Selecione o workspace padrão e deixe ele terminar de abrir. Uma vez aberto, siga para o menu Help>Install New Software:

Agora, seguindo estes passos você irá adicionar o repositório do google para que este eclipse possa nos servir para fazer projetos android:

Depois do ok aguarde um pouco, ele está indo na internet buscar a lista de plugins para você. Quando a lista se montar, Marque o Developer Tools e o Google Plugin for Eclipse:

Aceite as licenças e dê ok até não poder mais. O eclipse irá reiniciar e voltará com esse erro aqui:

Dê close no primeiro dialog e vamos dar next para baixar a SDK no segundo:


Estes downloads podem demorar um pouco, mas tenha paciência. Quando eles terminarem, maravilha, você terá um ambiente preparado pra criar aplicativos para android!
Nosso aplicativo será uma aplicação de lembretes. Comece criando o projeto chamado lembrete File>New>Project...>Android Application Project:

Agora use o nome que indicamos:

Siga dando next até o final. Nesta tela, mais downloads:

O projeto deve ficar assim:

Edite este leiaute para deixa-lo com a funcionalidade básica que necessitamos:

O código desta tela (com pequenas modificações, hehe) segue:


    

Vamos modificar o código do botão, para que ele dispare um método na MainActivity:



Feito isso, siga para a classe MainActivity. Adicione o método novoLembrete nela, deixando-a assim:

package com.example.lembrete;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @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;
    }
    
    
    public void novoLembrete(View view){
        
    }
}

Ao apertarmos o botão, uma nova Activity abrirá. Será a tela de cadastro de novos lembretes. Botão direito do mouse no projeto, New>Other...>Android>Android Activity:

Salve a activity com o nome NovoLembrete:

Uma vez criada, você terá uma classe java nova, um leiaute novo e deverá retornar ao método criado na MainActivity e deverá deixa-lo assim:

//...    
    public void novoLembrete(View view) {
        Intent in = new Intent(this, NovoLembrete.class);
        startActivity(in);
    }
//...

Dá até pra testar já. Vamos seguir fazer o seguinte, vamos criar uma instância do emulador pra testar. Aperte o botão do gerenciamento do SDK do android:

Quando ele abrir, marque a opção de baixar a ARM EABI v7a System Image:

Feito isso, feche o eclipse e abra-o novamente. Em seguida, vá para o gerenciador de dispositivos virtuais:

Ao abrir o gerenciador, vá para a aba Device Definitions e faça um Nexus S mesmo, apertando no botão Create AVD:

Não esqueça de informar um SD card e o tipo de CPU, além de dar uma quantidade decente de RAM pro emulador:

Pronto, você tem um telefone android agora, virtual mas é seu, ;-)
Agora dê botão direito sobre o projeto e vá na opção Run As>Android Application.
24-emulador-rodando
Pode demorar um pouco mas logo surgirá esta tela pra você:
25-app-rodando
Dica de ouro: não feche esse emulador mais. Assim você perde menos tempo para efetuar os testes, ;-)
Mas vamos trabalhar: mude o xml de layout do NovoLembrete para que ele fique assim:



    

        
    

    

Crie uma classe chamada LembeteOpenHelper:

package com.example.lembrete;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Toda aplicação que consuma sqlite necessita de um SQLiteOpenHelper
 * 
 * @author sombriks
 * 
 */
public class LembeteOpenHelper extends SQLiteOpenHelper {

 /**
  * uma boa estratégia de construtor é um que receba a activity e dela peça o
  * applicationContext
  * 
  * @param actv
  *            activity pedindo banco
  */
 public LembeteOpenHelper(Activity actv) {
  super(actv.getApplicationContext(), "lembrete.sqlite", null, 1);
 }

 @Override
 public void onCreate(SQLiteDatabase db) {
  db.execSQL("create table lembrete(id integer primary key autoincrement, valor text not null)");
 }

 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  // nada será feito para o upgrade
 }

 /**
  * @see http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#insert(java.lang.String, java.lang.String, android.content.ContentValues)
  * @param lembrete
  */
 public void addLembrete(String lembrete) {
  ContentValues cv = new ContentValues();
  // inclua os valores de cada coluna da tabela aqui
  cv.put("valor", lembrete);
  SQLiteDatabase db = getWritableDatabase();
  db.insert("lembrete", null, cv);
 }


 /**
  * @see http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String)
  * @return
  */
 public List getLembretes() {
  Cursor c = getReadableDatabase().query(false, "lembrete",
    new String[] { "valor" }, null, null, null, null, null, null);
  List list = new ArrayList();
  if(c != null && c.moveToFirst()) {   
   do {
    list.add(c.getString(c.getColumnIndex("valor")));
   } while (c.moveToNext());
  }
  return list;
 }

}


UPDATE: conforme o comentário do Alex no blog antigo, você deve fazer um xml de layout chamado itemlist.xml:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    

</TextView>


Agora seguimos para a activity de NovoLembrete:

package com.example.lembrete;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;

public class NovoLembrete extends Activity {

 private EditText txtLembrete;
 private LembeteOpenHelper service;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_novo_lembrete);
  txtLembrete = (EditText) findViewById(R.id.editText1);
  service = new LembeteOpenHelper(this);
 }

 @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_novo_lembrete, menu);
  return true;
 }
 
 public void salvarLembrete(View view) {
  String lembrete = txtLembrete.getText().toString();
  service.addLembrete(lembrete);
  finish();
 }

}

Note que ao adicionarmos o lembrete nós damos finish() na Activity. Com isso nós retornamos à activity anterior. Modifique a MainActivity para que ela fique assim:

package com.example.lembrete;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {

 private LembeteOpenHelper service;
 private ArrayAdapter adapter;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  service = new LembeteOpenHelper(this);
  ListView listView = (ListView) findViewById(R.id.listView1);
  adapter = new ArrayAdapter(this, R.layout.itemlist);
  listView.setAdapter(adapter);
 }

 // toda vez que a activity torna-se visível, este método é executado
 @Override
 protected void onResume() {
  super.onResume();
  adapter.clear();
  for (String lembrete : service.getLembretes())
   adapter.add(lembrete);
  adapter.notifyDataSetChanged();
 }

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

 public void novoLembrete(View view) {
  Intent in = new Intent(this, NovoLembrete.class);
  startActivity(in);
 }

}

Coloque pra rodar e veja o resultado:
26-app-resultado
Bacana né?
No final usar o banco de dados é simples, é um belo de um happy course. Usar os componentes Já disponíveis da API do android também ajuda muito, menção honrosa aqui ao ArrayAdapter, que no nosso caso resolveu de forma limpa nossa necessidade de alimentarmos nosso ListView.
Sem mais para o momento, até a próxima oportunidade.

Nenhum comentário :

Postar um comentário