2013-12-05 17 views
0

Я не могу обойти это исключение. Мне что-то не хватает?StringIndexOutOfBoundsException в SQLiteDatabase rawQuery()

Трассировка стека

12-05 20:07:43.129: E/AndroidRuntime(4154): FATAL EXCEPTION: Thread-1470 
12-05 20:07:43.129: E/AndroidRuntime(4154): java.lang.StringIndexOutOfBoundsException: length=0; regionStart=0; regionLength=6 
12-05 20:07:43.129: E/AndroidRuntime(4154):  at java.lang.String.startEndAndLength(String.java:593) 
12-05 20:07:43.129: E/AndroidRuntime(4154):  at java.lang.String.substring(String.java:1474) 
12-05 20:07:43.129: E/AndroidRuntime(4154):  at net.sqlcipher.database.SQLiteProgram.<init>(SQLiteProgram.java:69) 
12-05 20:07:43.129: E/AndroidRuntime(4154):  at net.sqlcipher.database.SQLiteQuery.<init>(SQLiteQuery.java:49) 
12-05 20:07:43.129: E/AndroidRuntime(4154):  at net.sqlcipher.database.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42) 
12-05 20:07:43.129: E/AndroidRuntime(4154):  at net.sqlcipher.database.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1420) 
12-05 20:07:43.129: E/AndroidRuntime(4154):  at net.sqlcipher.database.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1389) 

Запрос используется

Запрос = SELECT column1,max(datetime(creation_timestamp)) FROM table_name where dfs_id=? GROUP BY column2

(COLUMN1, COLUMN2, table_name и т.д. заполнители - не фактические имена)

Аргумент прошел = "a08eff29ee6a71dd_1381146091100_0002"


Примечания: Я использую SQLCipher (обертка SQLCipher), которые не должно иметь отношения к этому исключению.

+0

Да код Java :) – Blub

+0

является имя вашей таблицы 'table'? – Emmanuel

+0

SQL недействителен:' table' нужно указывать в backticks, если это имя таблицы, никакого выражения между 'AND' и' GROUP BY'. Но это, вероятно, вызовет какое-то другое исключение. Пожалуйста, напишите код Java, где вы делаете свой запрос. – laalto

ответ

1

code, вызывающий StringIndexOutOfBoundsException, является следующим.

/* package */ SQLiteProgram(SQLiteDatabase db, String sql) { 
    mDatabase = db; 
    mSql = sql.trim(); 
    db.acquireReference(); 
    db.addSQLiteClosable(this); 
    this.nHandle = db.mNativeHandle; 

    // only cache CRUD statements 
    String prefixSql = mSql.substring(0, 6); // <<<< HERE 

Единственная причина, почему вы можете получить, что исключение является String менее 6 символов. (Ваш номер length=0;, т. Е. Пустой после trim() несколько строк выше)

Нет указаний, где и как именно вам удавалось помещать пустую строку. Он исходит от SQLiteDatabase.rawQuery, но это могло быть вызвано из других методов запроса. Посмотрите дальше вниз по стеклу и просмотрите свой код, где вы, возможно, передаете пустую строку методу запроса.


Ваш запрос также, кажется, разорвать синтаксис где п: Если есть AND она должна была бы быть

WHERE {condition} AND {another condition expected here} GROUP BY ... 

Вы либо забыли добавить еще expression или у вас есть AND особо.

И table - зарезервированное ключевое слово. Чтобы использовать их в качестве имен, вам придется их процитировать. SQLite supports кавычки ("), обратные кавычки (`) и скобки ([]).

+1

«И» была опечаткой. Но да, я выяснил, что проблема - это пустая строка –

1

Я думаю, проблема заключается в том, что вы используете table для имени своей таблицы. TABLE - это команда в SQL; он не должен использоваться для имен таблиц. Поскольку SQL не чувствителен к регистру TABLE - это то же самое, что и table. Просто измените имя своей таблицы на другое.

0

Стек Трассирование показывает, что вы передаете пустую строку запроса функции rawQuery.

Смежные вопросы