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. Переименовал атрибут и все заработало.