Android 间歇性SQLiteException:在dbopen处不是错误
在我的应用程序中,我在很多情况下都使用DB,但有一种情况下我得到了一个异常,不是每次都是,并且可以重现它(现在) 这只发生在操作系统版本2.3.7和2.1-update-1上 守则:Android 间歇性SQLiteException:在dbopen处不是错误,android,sqlite,exception,getwritabledatabase,Android,Sqlite,Exception,Getwritabledatabase,在我的应用程序中,我在很多情况下都使用DB,但有一种情况下我得到了一个异常,不是每次都是,并且可以重现它(现在) 这只发生在操作系统版本2.3.7和2.1-update-1上 守则: public void removeOldOccurrences() { SQLiteDatabase db = dbHelper.getWritableDatabase(); Long oldTime = System.currentTimeMillis() - VALID_OCC
public void removeOldOccurrences() {
SQLiteDatabase db = dbHelper.getWritableDatabase();
Long oldTime = System.currentTimeMillis() - VALID_OCCURRENCE_TIME;
String query = "";
try {
query = "DELETE FROM " + LOCATIONS_TABLE + " WHERE not ("
+ REMEMBERED_FIELD + "=1) " + "and (" + LAST_FIELD + "<"
+ oldTime + ");";
db.execSQL(query);
} catch (Exception e) {
Log.e(TAG, query);
e.printStackTrace();
} finally {
if (db != null) {
db.close();
}
}
}
请帮助。看起来您的查询在
上是错误的,而不是
根据他们的说法,在你试图使用它的方式中没有一个not
(作为对where的否定)
您的选择似乎不是:
NOT LIKE
NOT GLOB
NOT REGEXP
NOT MATCH
NOT BETWEEN
NOT IN
IS NOT
其中大多数都需要一个表达式
WHERE xxxx NOT MATCH yyyy
此错误来自试图在其中创建/打开数据库的语句getWritableDatabase
从您给出的代码段中,我看到您正在尝试为每个操作打开数据库
这不是正确的方法。在关闭数据库之前,只需打开它一次。正常做法是在您的其他初始化过程中打开它,并在退出应用程序之前小心关闭它。一旦打开,存储数据库上下文并在所有其他操作中使用它
例如:您可以有这样一个数据库manegr类:
public DataBaseManager open() throws SQLException {
try {
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
} catch (Exception ex) {
ex.printStackTrace();
Utils.getHomeActivityinstance().finish();
}
return this;
}
现在,当需要调用delte时,不要再次调用open
public boolean deleteRow(String tableName, long rowId) {
return mDb.delete(tableName, ID + "=" + rowId, null) > 0;
}
我花了两个小时寻找这个问题的解决方案,这就是我无法在SQLite数据库中创建表的原因
我的错误是我有“is_selected”属性,这没有导致错误。重命名该属性并使其生效。在为查询传递空字符串时,我也收到了相同的错误。请确保查询中不包含在分号“;”之后的空行
我在Sqlite客户机中执行查询时也遇到了同样的问题,在四处查看之后,我发现问题在于查询下面有两行空行
如果有人遇到相同的问题,下面是Sqlite客户端(或加载.sql
文件)中的一些通过/失败案例
好:
好:
-- test2.sql
-- notice the empty line below doesn't break the code
SELECT * FROM table;
好:
坏的:
希望这能有所帮助。感谢您的回答,我知道这不是使用DB的有效方法,但我不明白您的解决方案在执行getWritableDatabase()时无法获得相同异常的原因。正如我提到的,我只在2.3.7和2.1-update-1上看到了这个异常,而不是每次都看到。一个可能的问题是“打开一个已经打开的数据库”。就我的设计而言,这个问题不会出现。嘿,老兄,谢谢你的回答。我不认为这是真的,有两个原因:1.同一个查询每次都会成功,除了这几个情况(大多数都在2.3.7上)。2.在您链接的同一文档中写道:“这些是一元前缀运算符:-+~NOT”。除此之外,当preetha说我在getWritableDatabase()方法中得到了异常时,他说并没有写。在我的例子中,我只有空格,从技术上讲不是空的,但同样的结果很好,这对我很有帮助。
-- test.sql
SELECT * FROM table;
-- test2.sql
-- notice the empty line below doesn't break the code
SELECT * FROM table;
-- test3.sql
-- notice the query string is not terminated by semicolon ";"
-- but it does contain trailing empty lines
SELECT * FROM table
-- this line is just a placeholder, in actual file this line should also be empty
-- test3.sql
-- notice the query string is terminated with semicolon,
-- and there are trailing empty lines after that
SELECT * FROM table;
-- this line is just a placeholder, in actual file this line should also be empty