【问题标题】:What does IllegalStateException: database not open mean?IllegalStateException: database not open 是什么意思?
【发布时间】:2015-08-29 04:22:26
【问题描述】:

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

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

这里是sn-p的代码:

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()还是一次?

【问题讨论】:

  • 这意味着您必须在执行查询之前创建与数据库的连接。 :)
  • 打开你的数据库,然后就可以使用了。
  • 我该怎么做,因为我可以在同一个类中运行其他查询,例如插入。只有删除会出错。 @kocko
  • 我该怎么做? @维格
  • 我需要看看你是如何设置你的数据库的——如果你使用的是 dbHelper。

标签: java android sqlite android-sqlite


【解决方案1】:

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

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

【讨论】:

  • 我在数据库类的顶部创建了一个构造函数。 Helper 是 SQLiteOpenHelper 的一个实例,代码:public testshop(Context context) { this.context = context; // create or open the database helper = new CustomSQLiteOpenHelper(context); this.db = helper.getWritableDatabase(); } 所以我应该在每次查询数据库时使用 getWriteableDatabase() 还是一次?
  • 不,打开数据库一次就够了。在删除之前尝试创建您的类的新实例。应用程序的上下文实际上可能存在问题。还要检查 whereClause 是否正确。
【解决方案2】:

就像两个 cmets(到目前为止)所说,您需要打开数据库进行写入。查看文档 (http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html)。 SQliteOpenHelper 非常易于使用,并为您做了很多此类工作。

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

【讨论】:

    【解决方案3】:

    也许你应该这样:

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

    之前

    db = this.getWriteableDatabase()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-22
      • 1970-01-01
      • 2017-12-02
      • 2014-01-23
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 2015-03-26
      相关资源
      最近更新 更多