IllegalStateException:数据库未打开是什么意思?

时间:2014-04-03 13:42:57

标签: java android sqlite android-sqlite

我在我的代码中运行SQLiteDatabase中的delete方法,它说:

  

IllegalStateException:数据库未在日志中打开。

以下是代码段:

String whereClause = getWhereClause(compareColumn, compareValue);

db.delete(tableName, whereClause, null);

这是生成的logcat。

04-03 16:32:09.514: E/DB DELETE ERROR(310): java.lang.IllegalStateException: database not open
04-03 16:32:09.514: W/System.err(310): java.lang.IllegalStateException: database not open
04-03 16:32:09.523: W/System.err(310):  at    android.database.sqlite.SQLiteDatabase.delete(SQLiteDatabase.java:1585)
04-03 16:32:09.523: W/System.err(310):  at mylibs.testshop.deleteRow(testshop.java:78)
04-03 16:32:09.523: W/System.err(310):  at com.example.testapp.shopping_list$1.onClick(shopping_list.java:98)
04-03 16:32:09.523: W/System.err(310):  at android.view.View.performClick(View.java:2408)
04-03 16:32:09.523: W/System.err(310):  at android.view.View$PerformClick.run(View.java:8816)
04-03 16:32:09.523: W/System.err(310):  at android.os.Handler.handleCallback(Handler.java:587)
04-03 16:32:09.533: W/System.err(310):  at android.os.Handler.dispatchMessage(Handler.java:92)
04-03 16:32:09.533: W/System.err(310):  at android.os.Looper.loop(Looper.java:123)
04-03 16:32:09.533: W/System.err(310):  at android.app.ActivityThread.main(ActivityThread.java:4627)
04-03 16:32:09.533: W/System.err(310):  at java.lang.reflect.Method.invokeNative(Native Method)
04-03 16:32:09.533: W/System.err(310):  at java.lang.reflect.Method.invoke(Method.java:521)
04-03 16:32:09.533: W/System.err(310):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)  
04-03 16:32:09.533: W/System.err(310):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)  
04-03 16:32:09.533: W/System.err(310):  at dalvik.system.NativeStart.main(Native Method)

我在数据库类的顶部创建了一个构造函数。 Helper是SQLiteOpenHelper的一个实例,代码为:

 public testshop(Context context) {
    this.context = context;
 // create or open the database
    helper = new CustomSQLiteOpenHelper(context);
    this.db = helper.getWritableDatabase();

}              

每次我想查询数据库时,我应该使用getWriteableDatabase()还是一次?

3 个答案:

答案 0 :(得分:2)

您需要先访问数据库。通常,当你使用SQLiteOpenHelper时,在删除之前你应该这样做:

db = this.getWriteableDatabase() // "this" is a subclass of SQLiteOpenHelper

答案 1 :(得分:0)

像这两条评论(到目前为止)已经说过,你需要打开数据库进行写作。看看文档(http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html)。 SQliteOpenHelper非常易于使用,并为您完成了很多这方面的工作。

对于这类事情有很多帮助,但直接写入和读取数据库并不是成功的秘诀恕我直言。

答案 2 :(得分:0)

可能是你应该这样:

    SQLiteDatabase db = mContext.openOrCreateDatabase(DB_NAME,
            Context.MODE_PRIVATE, null);

之前的

db = this.getWriteableDatabase()