Не удалось прочитать строку 0, col -1 из CursorWindow?

У меня проблема при использовании базы данных. Когда я запускаю свой SQLView.java, я получаю фатальное исключение:

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. 

Надеюсь, кто-то может мне помочь. Я напишу весь свой код, связанный с базой данных. Скажите, пожалуйста, когда вам нужно что-то еще, и не стесняйтесь спрашивать больше информации!

Я думаю, что что-то не так с моими столбцами, не могу понять, что.

Кроме того, я прочитал ВСЕ связанные вопросы на этом веб-сайте, но я не могу узнать, где я должен объявить свои столбцы и что добавить / изменить. Кто-нибудь знает, как это сделать? 🙂

Для начала: мой класс базы данных:

  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; } } 

Класс SQLite для исправления ввода:

 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 } } 

После этого, мой класс SQLView, для просмотра ввода из класса 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); } } 

Теперь мои 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> 

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> 

Класс меню, чтобы исправить меню, с помощью OnListItemClick (там есть другие действия, такие как Overgewicht. Не против этого, я думаю ..?):

 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 } } 

Мой файл манифеста Android: (опять же, я провозгласил некоторые другие вещи, не против!)

 <?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> 

Наконец, мой LogCat, чтобы показать вам ошибку:

 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 

Надеюсь, кто-то найдет время, чтобы помочь мне. Я очень благодарен тем, кто смотрит на него. Спасибо всем заранее.

Иаков

Solutions Collecting From Web of "Не удалось прочитать строку 0, col -1 из CursorWindow?"

 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); 

У вашего курсора нет столбца с именем DATABASE_NAME . Вероятно, вы имели в виду KEY_NAME для этого вызова getColumnIndex() который в этих формах возвращает -1 и попытка получить данные с таким индексом вызовет исключение, которое вы видите.