¿Cómo puedo recuperar datos de la base de datos con el cursor? (Android, SQLite)
Estoy atascado. No puedo averiguar qué hago mal, así que por favor ayude a cualquiera. Aunque es una tarea bastante sencilla, no entiendo cómo se ve realmente la base de datos.
Aquí está el código que utilizo para insertar datos en la tabla en la base de datos:
- WebView hace que SQLiteDiskIOException
- Opciones de SyncAdapter
- Cómo probar si el cursor está vacío en una consulta SQLiteDatabase
- ¿Cómo puedo leer mi base de datos de DDMS
- Sugar ORM simplemente no creará tablas
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 las columnas idfilm
, Title
, Director
, Year
, Rating
? Si es así, todavía hay un problema cuando intento recuperar todos los títulos de la columna Title
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 arroja NullPointerException? ¿Cómo debo obtener los datos de "Título"? Intenté usar c.getString (), pero cuando pido c.getString (1) todavía hay NullPointerException aunque devuelve "Director" cuando configuro c.getString (2). ¡Por favor ayuda!
- Alcanzó el tamaño MAX para la caché de instrucciones compiladas-sql para la base de datos
- Android DataBase está bloqueado por otro hilo
- Compruebe si el cursor tiene resultados
- Cómo lograr una relación de "herencia" en la base de datos SQLite en Android
- ¿Cómo puedo anotar correctamente las clases de herencia usando ORMLite?
- SQlite Obteniendo las ubicaciones más cercanas (con latitud y longitud)
- Resolución de conflictos en la base de datos SQLite de Android
- Base de datos SQLite en android y java
Su problema ocurre cuando rellena la base de datos (su primer segmento de código).
Es necesario combinar las INSERT
:
db.execSQL("INSERT INTO MyFilms (Title, Director, Year) VALUES('" + title + "','" + director + "'," + year + ");");
De lo contrario, terminará con filas que contengan un valor nulo para Title
o Director
.
( Nota: No utilice la notación de SQL anterior, ya que puede dejarlo vulnerable a la inyección de SQL.Lo escribí de esta manera por razones de simplicidad.En el código de producción, debe utilizar parámetros o desinfectar sus valores. convertirse en una víctima de Little Bobby Tables ).
EDITAR
Aquí hay algunos hilos sobre declaraciones preparadas:
- ¿Cómo utilizo las sentencias preparadas en SQlite en Android?
- ¿Consultas con declaraciones preparadas en Android?
si sus valores correctamente insertados del cuadro de edittext. entonces siga 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 sentencia lo muestra como una lista cuando la clase extiende una ListActivity.
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()); }
- Parece java clase estática interna, pero al parecer no es (no lo entiendo, ¿cómo es esto posible?)
- Ejemplo de analizador HTML de Android