Java IllegalStateException:数据库未打开意味着什么?
我在代码中运行SQLiteDatabase中的delete方法,它说: IllegalStateException:数据库未在日志中打开 下面是代码片段:Java IllegalStateException:数据库未打开意味着什么?,java,android,sqlite,android-sqlite,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.
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()
,还是只使用一次?正如两条评论(到目前为止)所说,您需要打开数据库进行编写。看一下文档()。SQliteOpenHelper非常容易使用,并且为您做了很多这方面的工作
对于这类事情有很多帮助,但是直接写入和读取数据库并不是成功的秘诀 您需要首先访问数据库。通常,在使用SQLiteOpenHelper时,在删除之前,应执行以下操作:
db = this.getWriteableDatabase() // "this" is a subclass of SQLiteOpenHelper
也许你应该这样做:
SQLiteDatabase db = mContext.openOrCreateDatabase(DB_NAME,
Context.MODE_PRIVATE, null);
在
db = this.getWriteableDatabase()
这意味着您必须在执行查询之前创建到数据库的连接。:)打开数据库,然后你就可以使用它了。我怎么做呢?因为我可以在同一个类中运行其他查询,比如insert。只有delete会出错@我该怎么做@VygerI需要看看你是如何设置你的数据库的——如果你使用的是dbHelper与否。Helper是SQLiteOpenHelper的一个实例,代码:
publictestshop(Context Context){this.Context=Context;//创建或打开数据库Helper=newcustomsqliteopenhelper(Context);this.db=Helper.getWriteableDatabase();}
那么我应该使用getWriteableDatabase()吗每次我想查询数据库还是只查询一次?不,打开数据库一次就足够了。在删除之前尝试创建类的新实例。实际上,应用程序的上下文可能有问题。还要检查Where子句是否正确。