¿Cómo recupero datos de la base de datos usando el cursor? (Android, SQLite)

Estoy atascado. No puedo averiguar qué es lo que hago mal, así que por favor ayude a alguien. Aunque es una tarea bastante simple, no entiendo cómo se ve realmente la base de datos.

Aquí está el código que uso para insertar datos en la tabla en la base de datos:

EditText title = (EditText)findViewById(R.id.Title); 
String Title = title.getText().toString();

EditText d = (EditText)findViewById(R.id.director); 
String Director = d.getText().toString();

SQLiteDatabase db = openOrCreateDatabase("Films", MODE_PRIVATE, null);
db.execSQL("CREATE TABLE IF NOT EXISTS MyFilms (idFilm INTEGER PRIMARY KEY AUTOINCREMENT, Title VARCHAR, Director VARCHAR, Year INTEGER, Rating INTEGER);");
db.execSQL("INSERT INTO MyFilms (Title) VALUES('" + Title + "');");
db.execSQL("INSERT INTO MyFilms (Director) VALUES('" + Director + "');");
db.close();

¿Este código me da una tabla con columnas? idfilm, Title, Director, Year, Rating? Si es así, todavía hay un problema cuando trato de recuperar todos los títulos de Title columna usando este código:

SQLiteDatabase db = openOrCreateDatabase("Films", MODE_PRIVATE, null);
Cursor c = db.rawQuery("SELECT * FROM MyFilms",null);
c.moveToFirst();

while (c.isAfterLast() == false) {
  String Title = c.getString(c.getColumnIndex("Director"));         
  stringList.add(Title); //This I use to create listlayout dynamically and show all the Titles in it
  c.moveToNext();
}

El registro de errores:

05-21 17:50:14.666: E/AndroidRuntime(27045): FATAL EXCEPTION: main
05-21 17:50:14.666: E/AndroidRuntime(27045): java.lang.NullPointerException
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:355)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.widget.AbsListView.obtainView(AbsListView.java:1409)
 05-21 17:50:14.666: E/AndroidRuntime(27045):   at android.widget.ListView.measureHeightOfChildren(ListView.java:1216)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.widget.ListView.onMeasure(ListView.java:1127)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.view.View.measure(View.java:8313)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.widget.RelativeLayout.measureChild(RelativeLayout.java:566)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:381)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.view.View.measure(View.java:8313)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.view.View.measure(View.java:8313)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:531)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.view.View.measure(View.java:8313)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.view.View.measure(View.java:8313)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.view.ViewRoot.performTraversals(ViewRoot.java:839)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.os.Looper.loop(Looper.java:123)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at android.app.ActivityThread.main(ActivityThread.java:3683)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at java.lang.reflect.Method.invokeNative(Native Method)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at java.lang.reflect.Method.invoke(Method.java:507)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-21 17:50:14.666: E/AndroidRuntime(27045):    at dalvik.system.NativeStart.main(Native Method)

¿Por qué DDMS lanza NullPointerException? ¿Cómo debo obtener los datos de "Título"? Traté de usar c.getString(), pero cuando solicito c.getString(1) todavía hay NullPointerException, aunque devuelve "Director" cuando configuro c.getString(2). ¡Por favor ayuda!

preguntado el 21 de mayo de 12 a las 18:05

publique el logcat para que podamos ver el error, pero no creo que esté creando su tabla correctamente:

3 Respuestas

si sus valores insertados correctamente desde el cuadro de texto de edición. entonces haz estos pasos. Recuperar valores

Cursor c = db.rawQuery("SELECT * FROM MyFilms",null);

if (c != null ) {
        if  (c.moveToFirst()) {
              do {
              String dir = c.getString(c.getColumnIndex("Director"));
              test.add("" + dir );
              }while (c.moveToNext());
        }
   }

Mostrar los valores como una lista

    this.setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,test));

La declaración lo muestra como una lista a medida que la clase extiende una ListActivity.

contestado el 21 de mayo de 12 a las 19:05

Su problema ocurre cuando llena la base de datos (su primer segmento de código).

Necesitas combinar el INSERT declaraciones:

db.execSQL("INSERT INTO MyFilms (Title, Director, Year) VALUES('" 
    + title + "','" + director + "'," + year + ");");

De lo contrario, terminará con filas que contienen un valor nulo para Title or Director.

(Nota: No use la notación SQL anterior, porque puede dejarlo vulnerable a la inyección de SQL. Solo lo escribí de esta manera en aras de la simplicidad. En el código de producción, debe usar parámetros o desinfectar sus valores. No se convierta en víctima de Pequeñas Mesas Bobby).

EDITAR

Aquí hay algunos hilos sobre declaraciones preparadas:

contestado el 23 de mayo de 17 a las 13:05

¿Qué uso para separar valores? ("+ Título + Director +") intenta ingresar 'TítuloDirector'. - zeliboba_fett

Oh, eso es muy, muy sabio, ¡ni siquiera lo pensé! ¡Muchas gracias! ¡Lo único que me gustaría pedirte es que me des un enlace a un tutorial donde pueda aprender cómo hacer lo que dijiste sobre los parámetros y los valores de desinfección! ¡Sería muy útil! De nuevo, ¡muchas gracias! PS Comic es hilarante! - zeliboba_fett

¡Seguro! Me alegro de haber podido ayudar. - Tony el pony

Utilice este código.

c.moveToFirst();
        if (c != null) {
            do {
                for (int i = 0; i < c.getColumnCount(); i++) {

                    Log.e("", "" + c.getString(i));
                }
            }while (c.moveToNext());
        }

Respondido el 04 de Septiembre de 14 a las 06:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.