SQLiteException:不是错误

时间:2012-05-06 11:31:26

标签: android sqlite exception getwritabledatabase

在我的应用程序中,我在许多情况下使用数据库,但有一种情况我得到了一个异常,并非每次都可以重现它(还)。

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

请帮忙。

5 个答案:

答案 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错误。重命名该属性并且工作正常。