domingo, 5 de febrero de 2012

Leer de base de datos SQLite #Android

Si recordamos de otra entrada del blog donde hablábamos de introducir una persona en base de datos (aquí), ahora vamos a leer cada una de las personas que tenemos almacenados. Una solución que podemos hacer es la siguiente:


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

import android.database.sqlite.SQLiteDatabase;
import android.database.Cursor;

import static android.provider.BaseColumns._ID;
import static org.development.meetingCost.Constants.TABLE_NAME;
import static org.development.meetingCost.Constants.NOMBRE;
import static org.development.meetingCost.Constants.APELLIDOS;
import static org.development.meetingCost.Constants.COSTEHORA;

public class AddPerson extends Activity implements OnClickListener  {
   
    private PersonData person;
    private static String[] FROM = {_ID, NOMBRE, APELLIDOS, COSTEHORA};
    private static String ORDER_BY = NOMBRE + " DESC";
    TextView listapersonas;
   
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.addperson);
      
        View continueButton = findViewById(R.id.crearpersona);
        continueButton.setOnClickListener(this);
        //Inicializamos person
        person = new PersonData(this);
        Cursor cursor = getPerson();
        showEvent(cursor);
    }
     
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId())
        {       
        case R.id.crearpersona:
            Intent j = new Intent(this, NewPerson.class);
            startActivity(j);
            break;
        }
    }
   
    public Cursor getPerson(){
        SQLiteDatabase db = person.getReadableDatabase();
        Cursor cursor = db.query(TABLE_NAME, FROM, null, null, null, null, ORDER_BY);
        startManagingCursor(cursor);
        return cursor;
    }
   
    public void showEvent(Cursor cursor){
             StringBuilder string = new StringBuilder();
        while (cursor.moveToNext()){
            long id = cursor.getLong(0);
            String nombre = cursor.getString(1);
            String apellidos = cursor.getString(2);
            long costehora = cursor.getLong(3);
            string.append(id).append(": ");
            string.append(nombre).append(" ");
            string.append(apellidos).append(" :");
            string.append(costehora).append("\n");
            }       
        listapersonas = (TextView) findViewById(R.id.listapersonas);
        listapersonas.setText(string);
    }       
}

Al igual que en el caso anterior, tenemos que crear e inicializar un objeto de la clase PersonData.java que es donde tenemos el enlace con la base de datos. Eso se hace con las siguientes líneas:
private PersonData person;
person = new PersonData(this); 
Después hay una llamada al método getPerson() que será el que nos devuelva la lista de personas que tenemos en la base de datos.

public Cursor getPerson(){
        SQLiteDatabase db = person.getReadableDatabase();
        Cursor cursor = db.query(TABLE_NAME, FROM, null, null, null, null, ORDER_BY);
        startManagingCursor(cursor);
        return cursor;
    }
El método lo que hace es devolver en un Cursor (algo similar a un Iterator) lo que obtiene de la base de datos.  Primero abrimos la conexión con la base de datos en modo lectura solamente con person.getReadableDatabase(); entonces ya podemos leer de la misma. Ahora viene lo mas importante, hemos visto que en la definición de variables había dos que eran:
    private static String[] FROM = {_ID, NOMBRE, APELLIDOS, COSTEHORA};
    private static String ORDER_BY = NOMBRE + " DESC";
Esto es empleado con db.query()para hacer la llamada a la base de datos y obtener en un Cursor lo que nos devuelve la consulta. Además queremos que lo ordene por nombre de ahí el ORDER BY. Por último llamamos al método que lo representa en pantalla showPerson(cursor);. Con este método lo que hacemos es ir rellenando un StringBuilder que por último con el setText() es introducido en el TextView.

   StringBuilder string = new StringBuilder();
        while (cursor.moveToNext()){
            long id = cursor.getLong(0);
            String nombre = cursor.getString(1);
            String apellidos = cursor.getString(2);
            long costehora = cursor.getLong(3);
            string.append(id).append(": ");
            string.append(nombre).append(" ");
            string.append(apellidos).append(" :");
            string.append(costehora).append("\n");
            }       
        listapersonas = (TextView) findViewById(R.id.listapersonas);
        listapersonas.setText(string);

Con esto lo que conseguimos es algo por el estilo:


 El xml que necesitamos para esto es:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:background="@color/background"
   android:layout_height="fill_parent"
   android:layout_width="fill_parent"
   android:orientation="vertical">
 
   <TextView
      android:id="@+id/listapersonas"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" />        
    <Button
          android:id="@+id/crearpersona"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:text="@string/crearpersona"
          android:onClick="crearpersona" />  
</LinearLayout>
Otro apunte más, espero que os sirva.


LIBRO RECOMENDADO PARA APRENDER ANDROID

Uno de los libros fundamientales y que recomiendo para aprender Android y llegar a hacer aplicaciones profesionales es: Android 2 Application Developement de Reto Meier




No hay comentarios :

Publicar un comentario