5

在我的应用程序中,我在很多情况下都使用 DB,但在一种情况下,我遇到了异常,不是每次都可以重现它(还)。

这仅在操作系统版本 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)

请帮忙。

4

5 回答 5

18

在传递空字符串进行查询时,我也收到了同样的错误。

于 2015-07-30T19:38:58.007 回答
4

此错误来自您尝试创建/打开数据库的语句 getWritableDatabase。

从您给出的代码段中,我看到您正在尝试为每个操作打开数据库。

这不是正确的做法。在关闭数据库之前,您只需打开一次数据库。通常的做法是在其他初始化期间打开它,并在退出应用程序之前小心关闭它。一旦打开存储数据库上下文并在所有其他操作中使用它

例如:你可以有一个这样的数据库管理类:

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;
}
于 2012-05-06T13:27:32.423 回答
2

确保您的查询不包含分号“;”之后的尾随空行 您的查询

我在 Sqlite 客户端中执行查询时遇到了同样的问题,在四处寻找之后我发现问题是我在查询下方有两个空行。

如果有人遇到同样的问题,这里有一些 Sqlite 客户端(或加载.sql文件)中的通过/失败案例。

好的:

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

希望这可以帮助。

于 2017-03-27T20:36:29.860 回答
1

看起来您的查询在not.

查看SQLite Docs,根据他们not的说法,您没有尝试使用它的方式(作为对您的位置的否定)。

您的选择似乎不是:

NOT LIKE
NOT GLOB
NOT REGEXP
NOT MATCH
NOT BETWEEN
NOT IN
IS NOT

其中大多数都需要在他们面前表达。

WHERE xxxx NOT MATCH yyyy
于 2012-05-06T12:52:59.280 回答
-1

我花了两个小时寻找这个问题的解决方案,这就是我无法在 SQLite 数据库中创建表的原因。

我的错误是我有“is_selected”属性,这导致了 NOT AN ERROR 错误。重命名属性并且它起作用了。

于 2012-11-22T20:43:51.657 回答