No se pudo leer la fila 0, col -1 de CursorWindow?

Tengo un problema al usar una base de datos. Cuando ejecuto mi SQLView.java, obtengo una excepción fatal:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jacob.eindproject/com.jacob.eindproject.SQLView}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 

Espero que alguien me pueda ayudar. Publicaré todo mi código relacionado con la base de datos. Por favor, dígale a mi cuando necesite algo más, y no dude en pedir más información!

Creo que hay algo mal con mis columnas, no puedo averiguar qué.

Además, he leído TODAS las preguntas relacionadas en este sitio web, pero no puedo averiguar dónde debo declarar mis columnas y qué agregar / cambiar. Alguien sabe cómo hacerlo? 🙂

Para empezar: my Database class:

  package com.jacob.eindproject; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; import java.sql.*; public class Database { public static final String KEY_ROWID = "_id"; public static final String KEY_NAME = "persons_name"; public static final String KEY_HOTNESS = "persons_hotness"; private static final String DATABASE_NAME = "Databasedb"; private static final String DATABASE_TABLE = "peopleTable"; private static final int DATABASE_VERSION = 1; private DbHelper ourHelper; private final Context ourContext; private SQLiteDatabase ourDatabase; private static class DbHelper extends SQLiteOpenHelper{ public DbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); // TODO Auto-generated constructor stub } @Override //I create it here, right? public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_NAME + " TEXT NOT NULL, " + KEY_HOTNESS + " TEXT NOT NULL);" ); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); onCreate(db); } public void close(Database database) { // TODO Auto-generated method stub } } public Database(Context c){ ourContext = c; } public Database open() throws SQLException{ ourHelper = new DbHelper(ourContext); ourDatabase = ourHelper.getWritableDatabase(); return this; } public void close() { ourHelper.close(); } public long createEntry(String name, String hotness) { ContentValues cv = new ContentValues(); cv.put(KEY_NAME, name); cv.put(KEY_HOTNESS, hotness); return ourDatabase.insert(DATABASE_TABLE, null, cv); } public String getData() { // TODO Auto-generated method stub String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_HOTNESS}; Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); String result = ""; int iRow = c.getColumnIndex(KEY_ROWID); int iName = c.getColumnIndex(DATABASE_NAME); int iHotness = c.getColumnIndex(KEY_HOTNESS); for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){ result = result + c.getString(iRow) + " " + c.getString(iName) + " " + c.getString(iHotness) + "\n"; } return result; } } 

La clase SQLite, para arreglar la entrada:

 package com.jacob.eindproject; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.app.Activity; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.view.View.OnClickListener; public class SQLite extends Activity implements View.OnClickListener { Button sqlUpdate, sqlView; EditText sqlName, sqlHotness; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sqllite); sqlUpdate = (Button) findViewById(R.id.bSQLUpdate); sqlName = (EditText) findViewById(R.id.etSQLName); sqlHotness = (EditText) findViewById(R.id.etSQLHotness); sqlView = (Button) findViewById(R.id.bSQLopenView); sqlView.setOnClickListener((android.view.View.OnClickListener) this); sqlUpdate.setOnClickListener((android.view.View.OnClickListener) this); } public void onClick(View arg0) { switch (arg0.getId()) { case R.id.bSQLUpdate: boolean didItWork = true; try{ String name = sqlName.getText().toString(); String hotness = sqlHotness.getText().toString(); Database entry = new Database(SQLite.this); entry.open(); entry.createEntry(name, hotness); entry.close(); }catch (Exception e ){ didItWork = false; }finally{ if (didItWork){ Dialog d = new Dialog(this); d.setTitle("Heak Yeay"); TextView tv = new TextView(this); tv.setText("Succes"); d.setContentView(tv); d.show(); } } break; case R.id.bSQLopenView: Intent i = new Intent("com.jacob.eindproject.SQLVIEW"); startActivity(i); } } public void onClick(DialogInterface arg0, int arg1) { // TODO Auto-generated method stub } } 

Después de eso, mi clase SQLView, para ver la entrada de la clase SQLite:

 package com.jacob.eindproject; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class SQLView extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sqlview); TextView tv = (TextView) findViewById(R.id.tvSQLinfo); Database info = new Database(this); info.open(); String data = info.getData(); info.close(); tv.setText(data); } } 

Ahora, mis archivos xml:

SQLView.xml:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <TableLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/tableLayout1"> <TableRow> <TextView android:text="@string/Names" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1"/> <TextView android:text="@string/Hotness" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" /> </TableRow> </TableLayout> <TextView android:id="@+id/tvSQLinfo" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="@string/info"/> </LinearLayout> 

El sqllite.xml:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/Naam" android:text="@string/Naam" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" /> <EditText android:id="@+id/etSQLName" android:layout_width="match_parent" android:layout_height="wrap_content"> </EditText> <TextView android:id="@+id/hotness" android:text="@string/hotnessscale" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <EditText android:id="@+id/etSQLHotness" android:layout_width="match_parent" android:layout_height="wrap_content"> </EditText> <Button android:id="@+id/bSQLUpdate" android:text="@string/Update" android:layout_width="wrap_content" android:layout_height="wrap_content" ></Button> <Button android:id="@+id/bSQLopenView" android:text="@string/View" android:layout_width="wrap_content" android:layout_height="wrap_content" ></Button> </LinearLayout> 

La clase de menú, para arreglar el menú, con un OnListItemClick (hay algunas otras actividades allí, como Overgewicht. No importa esto, supongo ..?):

 package com.jacob.eindproject; import android.app.ListActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; public class Menu extends ListActivity implements OnItemClickListener { String classes[] = { "BMI- Calculator", "Ondergewicht", "Gezond Gewicht", "Overgewicht", "Database", "Bekijk Database"}; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setListAdapter(new ArrayAdapter<String>(Menu.this, android.R.layout.simple_list_item_1, classes)); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { //Positie 0 is het eerste item (dus de BMI-Calculator.) super.onListItemClick(l, v, position, id); switch(position) { case 0: Intent openStartingPoint = new Intent(getApplicationContext(),MainActivity.class); startActivity(openStartingPoint); break; case 1: Intent openOndergewicht = new Intent(getApplicationContext(),Ondergewicht.class); startActivity(openOndergewicht); break; case 2: Intent openGezondgewicht = new Intent(getApplicationContext(),Gezond_gewicht.class); startActivity(openGezondgewicht); break; case 3: Intent openOvergewicht = new Intent(getApplicationContext(),Overgewicht.class); startActivity(openOvergewicht); break; case 4: Intent openDatabase = new Intent(getApplicationContext(),SQLite.class); startActivity(openDatabase); break; case 5: Intent openViewdatabase = new Intent(getApplicationContext(),SQLView.class); startActivity(openViewdatabase); break; } } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub } } 

Mi archivo de manifiesto de Android: (de nuevo, he declarado algunas otras cosas, no me importa estas!)

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.jacob.eindproject" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.jacob.eindproject.Menu" android:label="@string/app_name" > </activity> <activity android:name="com.jacob.eindproject.Inleiding" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.jacob.eindproject.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name="com.jacob.eindproject.Ondergewicht" android:label="@string/app_name" > </activity> <activity android:name="com.jacob.eindproject.Gezond_gewicht" android:label="@string/app_name" > </activity> <activity android:name="com.jacob.eindproject.Overgewicht" android:label="@string/app_name" > </activity> <activity android:name="com.jacob.eindproject.Database" android:label="@string/app_name" > <intent-filter> <action android:name="com.jacob.eindproject.DATABASE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name=".SQLView" android:label="@string/app_name" > <intent-filter> <action android:name="com.jacob.eindproject.SQLVIEW" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name="com.jacob.eindproject.SQLite" android:label="@string/app_name" > <intent-filter> <action android:name="com.jacob.eindproject.SQLITE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application> </manifest> 

Por fin, mi LogCat, para mostrarle el error:

 12-14 11:04:18.227: E/AndroidRuntime(1577): FATAL EXCEPTION: main 12-14 11:04:18.227: E/AndroidRuntime(1577): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jacob.eindproject/com.jacob.eindproject.SQLView}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 12-14 11:04:18.227: E/AndroidRuntime(1577): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 12-14 11:04:18.227: E/AndroidRuntime(1577): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 12-14 11:04:18.227: E/AndroidRuntime(1577): at android.app.ActivityThread.access$600(ActivityThread.java:141) 12-14 11:04:18.227: E/AndroidRuntime(1577): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 12-14 11:04:18.227: E/AndroidRuntime(1577): at android.os.Handler.dispatchMessage(Handler.java:99) 12-14 11:04:18.227: E/AndroidRuntime(1577): at android.os.Looper.loop(Looper.java:137) 12-14 11:04:18.227: E/AndroidRuntime(1577): at android.app.ActivityThread.main(ActivityThread.java:5103) 12-14 11:04:18.227: E/AndroidRuntime(1577): at java.lang.reflect.Method.invokeNative(Native Method) 12-14 11:04:18.227: E/AndroidRuntime(1577): at java.lang.reflect.Method.invoke(Method.java:525) 12-14 11:04:18.227: E/AndroidRuntime(1577): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 12-14 11:04:18.227: E/AndroidRuntime(1577): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 12-14 11:04:18.227: E/AndroidRuntime(1577): at dalvik.system.NativeStart.main(Native Method) 12-14 11:04:18.227: E/AndroidRuntime(1577): Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 12-14 11:04:18.227: E/AndroidRuntime(1577): at android.database.CursorWindow.nativeGetString(Native Method) 12-14 11:04:18.227: E/AndroidRuntime(1577): at android.database.CursorWindow.getString(CursorWindow.java:434) 12-14 11:04:18.227: E/AndroidRuntime(1577): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51) 12-14 11:04:18.227: E/AndroidRuntime(1577): at com.jacob.eindproject.Database.getData(Database.java:95) 12-14 11:04:18.227: E/AndroidRuntime(1577): at com.jacob.eindproject.SQLView.onCreate(SQLView.java:16) 12-14 11:04:18.227: E/AndroidRuntime(1577): at android.app.Activity.performCreate(Activity.java:5133) 12-14 11:04:18.227: E/AndroidRuntime(1577): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 12-14 11:04:18.227: E/AndroidRuntime(1577): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 12-14 11:04:18.227: E/AndroidRuntime(1577): ... 11 more 

Espero que alguien se tome el tiempo para ayudarme. Estoy muy agradecido a los que lo echan un vistazo. Gracias a todos de antemano.

Jacob

 String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_HOTNESS}; Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); String result = ""; int iRow = c.getColumnIndex(KEY_ROWID); int iName = c.getColumnIndex(DATABASE_NAME); 

Su cursor no tiene una columna con nombre DATABASE_NAME . Es probable que haya significado KEY_NAME para esta llamada getColumnIndex() que en este formulario devuelve -1 y al tratar de obtener datos con un índice de este tipo, causará la excepción que ha visto.

  • Empaquetado DB de SQLite con mi aplicación
  • Android SQL: Comprobar si existe registro en la base de datos
  • Android SQLite Eliminar problema de fila
  • Android MediaStore obtiene distintas carpetas de archivos de música
  • Shell de salida Android de sqlite
  • ¿Qué caracteres no se pueden utilizar para valores en bases de datos SQLite?
  • ¿Por qué no conectar android a la base de datos directamente?
  • SQLite de Android: Actualización
  • ¿Consulta para obtener registros basados ​​en Radius en SQLite?
  • SQLite: forma eficiente de eliminar lotes de filas
  • Multi-parámetro en ActiveAndroid
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.