SQLiteDatabase中的StringIndexOutOfBoundsException rawQuery()

时间:2013-12-05 14:49:42

标签: java android sqlite sqlcipher

我无法绕过这个例外。我错过了一些明显的东西吗?

堆栈跟踪

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的包装器),它与此异常无关。

3 个答案:

答案 0 :(得分:1)

我认为问题在于您使用table作为表名。 TABLE是SQL中的命令;它不应该用于表名。由于SQL不区分大小写TABLEtable相同。只需将表的名称更改为其他名称即可。

答案 1 :(得分:1)

导致StringIndexOutOfBoundsException的{​​{3}}如下。

/* 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但可以从其他查询方法调用。进一步查看堆栈跟踪并查看您可能将空字符串传递给查询方法的代码。


您的查询似乎也打破了where子句的语法: 如果有AND则必须

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

您忘了添加其他code,或者您有AND太多。

table是保留关键字。要将它们用作名称,您必须引用它们。 expression引号(“),反引号(`)和括号([])。

答案 2 :(得分:0)

堆栈跟踪显示您为rawQuery函数提供了一个空查询字符串。