我无法绕过这个例外。我错过了一些明显的东西吗?
堆栈跟踪
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 :(得分:1)
我认为问题在于您使用table
作为表名。 TABLE
是SQL中的命令;它不应该用于表名。由于SQL不区分大小写TABLE
与table
相同。只需将表的名称更改为其他名称即可。
答案 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
函数提供了一个空查询字符串。