2012-08-22 10 views
16

Estoy programando una aplicación de Android que debe usar una base de datos para almacenar datos y leer de ellos. Usando this tutorial (on archive.org) obtuve la aplicación para crear una base de datos y soy capaz de crear nuevas entradas, sin embargo, no sé, cómo leer la base de datos para obtener los datos almacenados en un ListView. Sé que hay muchas preguntas similares en este sitio web, pero parece que ninguna de ellas se aplica a la forma en que funciona la base de datos del tutorial.Android: Usando SimpleCursorAdapter para obtener datos de la base de datos en ListView

Código:

import java.util.Calendar; 

import maturarbeit.nicola_pfister.studenttools.database.DBAdapter; 
import android.app.AlertDialog.Builder; 
import android.app.ListActivity; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnClickListener; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.widget.ListView; 


public class Marks extends ListActivity { 

DBAdapter db = new DBAdapter(this); 

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

@Override 
protected void onPause() { 
    super.onPause(); 
    db.close(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    db.open(); 

    getData(); 
} 

@SuppressWarnings("deprecation") 
private void getData() { 
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_list_item_1, 
      db.getAllMarks(), 
      new String[] { "value" }, 
      new int[] { android.R.id.text1 }); 

    ListView listView = (ListView) findViewById(R.id.marks_list); 
    listView.setAdapter(adapter); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.marks, menu); 
    return true; 
} 

public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.menu_add: 
     Calendar cal = Calendar.getInstance(); 
     int day = cal.get(Calendar.DAY_OF_MONTH); 
     int month = cal.get(Calendar.MONTH); 
     final String date = day + "." + month; 
     Builder builder = new Builder(this); 
     builder 
      .setTitle(R.string.dialog_addmarks) 
      .setItems(R.array.markslist, new OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        @SuppressWarnings("unused") 
        long id; 
        String selection = getResources().getStringArray(R.array.markslist)[which]; 
        id = db.insertMark(date, "Default", selection); 
        } 
      }) 
      .show(); 
     getData(); 
     break; 
    case R.id.menu_delete: 
      //Deleting function yet to be implemented. 
     break; 
    } 
    return super.onOptionsItemSelected(item); 
} 
} 

Editar: El ID de ListView que estaba mal, ya que tenía que ser android: lista.

Respuesta

53

Usando el formato de base de datos en el tutorial que se ha vinculado a, cada fila tiene un _id, isbn, title, y publisher. Ahora vamos a suponer que desea mostrar cada título en un ListView:

db = new DBAdapter(this); 
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
     android.R.layout.simple_list_item_1, 
     db.getAllTitles(), 
     new String[] { "title" }, 
     new int[] { android.R.id.text1 }); 

ListView listView = (ListView) findViewById(R.id.list); 
listView.setAdapter(adapter); 

(que no es necesario para recorrer el cursor a sí mismo, un adaptador funciona esto para usted!)

Los dos últimos los parámetros en su constructor SimpleCursorAdapter son lo que se está perdiendo. Son el "de" y "a" parámetros:

  • Queremos obtener el nombre de cada libro que se almacena en el nombre de columna title, aquí es donde se obtiene la información "de".
  • A continuación tenemos que decir dónde "ir": android.R.id.text1 es una vista de texto en el diseño android.R.layout.simple_list_item_1. (Se puede excavar a través de su SDK y ver el archivo de simple_list_item_1.xml sí mismo o sólo confía en mí por el momento.)

Ahora tanto el "de" y "a" parámetros son matrices, ya que podemos pasar más de una columna de información, tratar este adaptador, así:

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
     android.R.layout.simple_list_item_2, 
     db.getAllTitles(), 
     new String[] { "title", "publisher" }, 
     new int[] { android.R.id.text1, android.R.id.text2 }); 

Con este adaptador de los libros en su base de datos se visualiza por título, entonces editor. Todo lo que tuvimos que hacer es usar un diseño android.R.layout.simple_list_item_2 que tome dos campos y definir qué columnas van a qué TextViews.

Espero que ayude un poco. Hay mucho más por aprender, pero tal vez esto le dará algunos conceptos básicos.


último comentario

De la parte superior de mi cabeza, para actualizar la ListView después de añadir nuevos datos intente esto:

public void onClick(DialogInterface dialog, int which) { 
    String selection = getResources().getStringArray(R.array.markslist)[which]; 
    db.insertMark(date, "Default", selection); 
    cursor.requery(); 
    adapter.notifyDataSetChanged(); 
} 

Usted tendrá que definir y crear un adapter variable para cursor pero eso es simple:

public class Marks extends ListActivity { 
    SimpleCursorAdapter adapter; 
    Cursor cursor; 
    DBAdapter db = new DBAdapter(this); 
    ... 

Y cambiar getData() en consecuencia:

private void getData() { 
    cursor = db.getAllMarks(); 
    adapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_list_item_1, 
      cursor, 
      new String[] { "value" }, 
      new int[] { android.R.id.text1 }); 
    ... 
} 

Buena suerte!

+0

Gracias. Creo que entiendo, lo que estás tratando de explicar. Usé tu adaptador, pero sigo recibiendo una excepción que bloquea mi aplicación. Supongo que el error está en otro lugar entonces? – BlueHazard

+0

Copie y pegue el LogCat (use el enlace de edición en la parte inferior izquierda de su pregunta). Le daré un vistazo. Etiquetarme en un comentario (con "@Sam") cuando haya hecho esto. – Sam

+0

He agregado el LogCat a mi pregunta. Gracias por ayudarme. – BlueHazard

0

No se utiliza un adaptador en cada elemento del cursor, se crea un adaptador para todo el cursor. Puede establecer esta vista de lista para usar ese cursor. Pruebe algunos tutoriales SimpleCursorAdapter como this

Cuestiones relacionadas