在我的应用程序中,我在许多情况下使用数据库,但有一种情况我得到了一个异常,并非每次都可以重现它(还)。
仅在操作系统版本2.3.7和2.1-update-1上发生。
代码:
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();
}
}
}
异常跟踪是:
android.database.sqlite.SQLiteException: not an error
at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
at android.database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:1849)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)
at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847)
at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:573)
at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
请帮忙。
答案 0 :(得分:15)
传递空字符串进行查询时,我也收到了同样的错误。
答案 1 :(得分:4)
此错误来自您尝试创建/打开数据库的语句getWritableDatabase。
从你给出的代码段中,我看到你正在尝试为每个操作打开数据库。
这不是正确的方法。在关闭数据库之前,您只需打开一次数据库。正常练习在您的其他初始化期间打开它,并在退出应用程序之前注意关闭它。一旦打开存储db上下文并在所有其他操作中使用
例如:你可以拥有这样的数据库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时,不要再打开
public boolean deleteRow(String tableName, long rowId) {
return mDb.delete(tableName, ID + "=" + rowId, null) > 0;
}
答案 2 :(得分:1)
not
上看起来你的查询不好。
查看SQLite Docs,根据它们,您尝试使用它的方式没有not
(作为对您的位置的否定)。
您的选择似乎不是:
NOT LIKE
NOT GLOB
NOT REGEXP
NOT MATCH
NOT BETWEEN
NOT IN
IS NOT
其中大部分需要在他们面前表达。
WHERE xxxx NOT MATCH yyyy
答案 3 :(得分:1)
确保您的查询在分号&#34;;&#34;之后不包含尾随空行。您的查询。
我在Sqlite客户端内执行查询时遇到了同样的问题,在探索之后我发现问题是我在查询下面有两个空行。
如果有人遇到同样的问题,这里有一些Sqlite客户端内的通过/失败案例(或加载-- 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
为:
{{1}}
希望这有帮助。
答案 4 :(得分:-1)
我花了两个小时寻找这个问题的解决方案,这就是我无法在SQLite数据库中创建表的原因。
我的错误是我有“is_selected”属性,这导致NOT AN ERROR错误。重命名该属性并且工作正常。