使用数据库时出现问题。当我运行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>
用于修复菜单的Menu类,带有一个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
希望有人花时间帮助我。我非常感谢那些对此感兴趣的人。提前谢谢大家。
雅各布
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,并且尝试使用此类索引获取数据将导致您所看到的异常。
DATABASE_NAME
KEY_NAME
getColumnIndex()