Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java IllegalStateException:数据库未打开意味着什么?_Java_Android_Sqlite_Android Sqlite - Fatal编程技术网

Java 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.

我在代码中运行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()
,还是只使用一次?

正如两条评论(到目前为止)所说,您需要打开数据库进行编写。看一下文档()。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子句是否正确。