Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/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
Android 间歇性SQLiteException:在dbopen处不是错误_Android_Sqlite_Exception_Getwritabledatabase - Fatal编程技术网

Android 间歇性SQLiteException:在dbopen处不是错误

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

在我的应用程序中,我在很多情况下都使用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();
            }
        }
    }

请帮助。

看起来您的查询在
上是错误的,而不是

根据他们的说法,在你试图使用它的方式中没有一个
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