SQLiteException: не ошибка

В моем приложении я использую 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)

пожалуйста помоги.

5 ответов

Я также получил эту же ошибку при передаче пустой строки для запроса.

Эта ошибка исходит от оператора 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 Client, после того, как я покопался, я обнаружил, что проблема в том, что у меня под запросом две пустые строки.

В случае, если кто-то сталкивался с той же проблемой, вот несколько случаев успешного / неудачного выполнения в клиенте 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

Надеюсь это поможет.

Похоже, ваш запрос плохо not,

Глядя на документы SQLite, по их мнению, нет not таким образом, как вы пытаетесь использовать его (как отрицание того, где вы).

Ваш выбор не выглядит так:

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

И большинство из них требуют выражения перед ними.

WHERE xxxx NOT MATCH yyyy

Я потратил два часа на поиски решения этой проблемы, поэтому я не смог создать таблицу в базе данных SQLite.

Моя ошибка была в том, что у меня был атрибут is_selected, и это вызвало ошибку NOT AN ERROR. Переименовал атрибут и все заработало.

Другие вопросы по тегам