Pplware

Tutorial: Utilização do sqlite no Android (Parte II)

Por Mário Baltazar para o Pplware

Tutorial realizado no âmbito do Mestrado em Computação Móvel do Instituto Politécnico da Guarda na Unidade Curricular de Seminário

A plataforma Android foi introduzida no mercado pela Google em 2007 e é composta por um sistema operativo embebido e um conjunto de aplicações que integram com a plataforma.  Além das várias inovações implementadas, o Android traz também suporte nativo para o SQLite. O SQLite é uma pequena biblioteca, desenvolvida em linguagem C, que implementa um amplo subconjunto do standard SQL 92, sendo a sua reputação proveniente da combinação do motor de base de dados com a interface dentro de uma única biblioteca.

Este artigo será dividido em duas partes e depois de termos ensinado a criar criar as classes para interagir com o sqlite, hoje vamos proceder à criação  da aplicação.

No tutorial anterior deixamos as classes auxiliares para ligar à base de dados prontas a serem “consumidas” pela nossa aplicação, vamos agora ver como as iremos utilizar.

5 – vamos desenhar inicial que irá listar os contactos existentes na base de dados e terá um botão que permitirá adicionar um novo Contacto.

5.1 – Abrir o ficheiro main.xml e alterar o layout para o seguinte:

	
 
         
         
          


6 – Vamos criar um novo Layout com o nome: “contacto_list_item” onde iremos definir a forma como cada item da lista será mostrado.

 
             
             

7 – Vamos agora alterar a classe ContactosActivity.java para listar os contactos existentes na base de dados.

import android.app.ListActivity; 
import android.os.Bundle; 
public class ContactosActivity extends ListActivity { 
           ListAdapter adapter; 
           DBAdapter datasource; 
          @Override 
           public void onCreate(Bundle savedInstanceState) { 
                     super.onCreate(savedInstanceState); 
                     setContentView(R.layout.main); 
                     datasource = new DBAdapter(this); 
                     datasource.open(); 
                     Cursor cursor = datasource.getContactos(); 
                     String[] columns = new String[] { "nome","telefone" }; 
                     int[] to = new int[] { R.id.nome, R.id.telefone}; 
                     adapter = new SimpleCursorAdapter(this, R.layout.contacto_list_item, 
                                       cursor, 
                                       columns, 
                                       to); 
                                       this.setListAdapter(adapter); 
                     datasource.close(); 
            } 
}

8 – Adicionar Novo contacto Vamos agora permitir que na nossa aplicação possa adicionar contactos.

8.1 – Acrescentar um layout com o nome novocontacto.xml

Código do layout:

 
 
 
 
 
 
 
 
 
 
 
 
 
 

9 – Vamos agora acrescentar uma activity no ficheiro AndroidManifest.xml

 
         
                 
                 
        

10 – Alterar o ficheiro ContactoActivity para passar para o ecrã NovoContacto. 10.1 – Criar variável para aceder ao botão Novo Contacto:

Button btNovoContacto;

10.2 – Criar ligação entre botão e o elemento da interface, e adicionar a acção que irá fazer o botão, no método onCreate:

btNovoContacto = (Button) findViewById(R.id.btNovoContacto);
btNovoContacto.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent novo = new Intent("mbaltazar.contactos.NovoContacto");
startActivity(novo);
}
});

11- Acrescentar nova classe chamada NovoContacto e indicar que expande a classe Activity

public class NovoContacto extends Activity {
}

11.1 – Acrescentar o método onCreate e alterar o parâmetro do método setContentView para indicar o novo ficheiro de layout novocontacto.xml como o layout da nova Activity.


public class NovoContacto extends Activity {
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.novocontacto);
}
}

11.2 – Criar variáveis para aceder aos elementos da interface Novo Contacto:

Button btadicionar;
Button btTirarFoto;
EditText edtNome;
EditText edtEmail;
EditText edtTelefone;
ImageView iv;
final static int cameraData = 0;

11.3 – No evento onCreate criar a ligação entre as variáveis e os elementos da interface:

edtNome = (EditText) findViewById(R.novocontacto.ednome);
edtEmail = (EditText) findViewById(R.novocontacto.edEmail);
edtTelefone = (EditText) findViewById(R.novocontacto.edTelefone);
btadicionar = (Button) findViewById(R.novocontacto.btadicionar);
btTirarFoto = (Button) findViewById(R.novocontacto.tirarFoto);
iv = (ImageView) findViewById(R.novocontacto.ivReturnedPic);

11.4 – Adicionar, no método onCreate, a acção do botão tirar Foto:

btTirarFoto.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i= new
Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(i,cameraData);
}
});

11.5 – Adicionar o método onActivityResult, quando for tirada a fotografia é apresentada a imagem no controlo imageView:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
if(resultCode == RESULT_OK){
Bundle extras = data.getExtras();
Bitmap bmp = (Bitmap) extras.get("data");
iv.setImageBitmap(bmp);
}
super.onActivityResult(requestCode, resultCode, data);
}

11.6 – Adicionar uma instância da classe DBAdapter

private DBAdapter datasource;

11.7 – inicializar datasource no método onCreate

datasource = new DBAdapter(this);

11.8 – Alterar o método onCreate e adicionar a acção do botão Adicionar:

btadicionar.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
datasource.open();
Contacto c = datasource.createContacto(edtNome.getText().toString(),
edtEmail.getText().toString(),
edtTelefone.getText().toString(),loadBitmapFromView(iv));
datasource.close();
AlertDialog.Builder dialogo = new
AlertDialog.Builder(NovoContacto.this);
dialogo.setTitle("Aviso");
dialogo.setMessage("Contacto:" + c.getNome());
dialogo.setNeutralButton("OK", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int id) {
finish();
}
});
dialogo.show();
}
});

11.9 – Adicionar um método adicional para retornar o bitmap da imageView:

public static Bitmap loadBitmapFromView(View v) {
Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width,
v.getLayoutParams().height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
v.draw(c);
return b;
}

Com este código já é permitido adicionar um contacto à base de dados.

12 – Vamos agora alterar na classe ContactosActivity para que no final de adicionarmos o contacto este já seja apresentado na lista:

@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
datasource.open();
Cursor cursor = datasource.getContactos();
String[] columns = new String[] { "nome","telefone" };
int[] to = new int[] { R.id.nome, R.id.telefone};
adapter = new SimpleCursorAdapter(
this,
R.layout.contacto_list_item,
cursor,
columns,
to);
this.setListAdapter(adapter);
datasource.close();
}

12.1 – Vamos adicionar o método onListItemClick, método que é chamado sempre que é clicado um item da lista:

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Intent intent = new Intent("com.contactos.DetalhesContacto");
Cursor cursor = (Cursor) adapter.getItem(position);
intent.putExtra("idContacto",cursor.getInt(cursor.getColumnIndex("_id")));
startActivity(intent);
}

13 – criar a interface para ver os detalhes do contacto. 13.1 – Criar um novo ficheiro com o nome detalhecontacto.xml e alterar o ficheiro com o seguinte layout:

 
 


 
 
 
 
 
 
 


 
 
 
 
 
 
 
 


 
 

No final a interface ficará com o seguinte aspecto:

14 – De seguida vamos acrescentar a nova activity para mostrar os detalhes do contacto:

 
 
 
 
 

15 – Adicionar nova classe com nome Contactos Detalhes, esta vai expandir a classe Activity:

public class DetalhesContacto extends Activity {
}

15.1 – Acrescentar o método onCreate e alterar o parâmetro do método setContentView para indicar o novo ficheiro de detalhecontacto.xml como o layout da nova Activity DetalheContacto.

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.detalhecontacto);
}

15.2 – Criar variáveis para aceder aos elementos da interface:

int idContacto;
ContactoDataSource datasource;
Contacto contacto;
TextView edtNome;
TextView edtEmail;
TextView edtTelefone;
Button btVoltar;
Button btEliminar;
ImageView ivFoto;

15.3 – No evento onCreate criar a ligação entre as variáveis da classe e os elementos da interface.

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.detalhecontacto);
edtNome = (TextView) findViewById(R.lista.txtnome);
edtEmail = (TextView) findViewById(R.lista.txtEmail);
edtTelefone = (TextView) findViewById(R.lista.txtTelefone);
ivFoto = (ImageView) findViewById(R.id.ivFoto);
btEliminar = (Button) findViewById(R.id.btEliminar);
btVoltar = (Button) findViewById(R.lista.btmenu);
}

15.4 – Adicionar um nova função que irá colocar nos elementos da interface os detalhes do contacto:

private void carregaDetalhesContacto(){
idContacto = getIntent().getIntExtra("idContacto", 0);
datasource = new DBAdapter(this);
datasource.open();
contacto = datasource.getContacto(idContacto);
datasource.close();
ivFoto.setImageBitmap(contacto.getFoto());
edtNome.setText(contacto.getNome());
edtEmail.setText(contacto.getEmail());
edtTelefone.setText(contacto.getTelefone());
}

15.5 – Chamar a função carregaDetalhesContacto() na função onCreate.

15.6 – Adicionar à função onCreate a acção dos botões da interface:

btVoltar.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
});
btEliminar.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
AlertDialog.Builder dialogo = new
AlertDialog.Builder(ContactosDetalhes.this);
dialogo.setTitle("Aviso");
dialogo.setMessage("Eliminar Contacot?");
dialogo.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
});
dialogo.setPositiveButton("Eliminar",new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
datasource.open();
datasource.EliminaContacto(idContacto);
datasource.close();
finish();
}
});
dialogo.show();
}
});

Com isto terminamos a nosso pequena aplicação de registo de contactos utilizando o sqlite.


Download: Projecto Android – Contactos

Exit mobile version