Android: utilizando SimpleCursorAdapter para obtener datos de la base de datos en ListView

Estoy progtwigndo una aplicación de Android que debería usar una base de datos para almacenar datos y leer de ellos. Usando este tutorial (en archive.org) obtuve la aplicación para crear una base de datos y puedo 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.

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: La ID de ListView estaba mal, ya que tenía que ser android: list.

Utilizando el formato de base de datos en el tutorial al que se ha vinculado, cada fila tiene un _id , isbn , title y publisher . Ahora supongamos 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); 

(No necesita pasar por el Cursor usted mismo, ¡un adaptador hace que esto funcione para usted!)

Los últimos dos parámetros en su constructor SimpleCursorAdapter son los que le faltan. Son los parámetros “desde” y “hasta”:

  • Queremos obtener el nombre de cada libro que está almacenado en el title nombre de la columna, aquí es donde obtenemos la información “de”.
  • A continuación, tenemos que decirle dónde ir: ” android.R.id.text1 es una vista de texto en el diseño de android.R.layout.simple_list_item_1 . (Puede explorar su SDK y ver el archivo simple_list_item_1.xml usted mismo o simplemente confiar en mí por el momento).

Ahora, tanto los parámetros “desde” como “hasta” son matrices porque podemos pasar más de una columna de información, pruebe este adaptador también:

 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, los libros en su base de datos se mostrarán por título y luego editorial. Todo lo que tuvimos que hacer es usar un diseño android.R.layout.simple_list_item_2 que tome dos campos y defina qué columnas van a qué TextViews.

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


Último comentario

Fuera de mi cabeza, para actualizar el ListView después de agregar 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(); } 

Tendrá que definir el adapter y crear una variable para el cursor pero eso es simple:

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

Y cambie 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!

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 de SimpleCursorAdapter como este