java - SQLiteDatabase rawQuery() 中的 StringIndexOutOfBoundsException

标签 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=?按列2分组

(column1、column2、table_name 等是占位符 - 不是实际名称)

参数已通过 = "a08eff29ee6a71dd_1381146091100_0002"

<小时/>

注意:我正在使用 SQLCipher(SQLCipher 的包装器),它应该与此异常无关。

最佳答案

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

<小时/>

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

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

您要么忘记添加另一个 expression或者你的 AND 太多了。

并且table是保留关键字。要使用它们作为名称,您必须引用它们。 SQLite supports引号 (")、反引号 (`) 和方括号 ([])。

关于java - SQLiteDatabase rawQuery() 中的 StringIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20403080/

相关文章:

android - 如何在多列sqlite数据库上过滤多个数据

android - 比较android中的两个Arraylists

java - 为什么 "long var = System.nanoTime()"和 "System.nanoTime()"的使用时间如此不同?

java - 如何创建一个方法来检查数组中是否有奇数?

java - 在JAVA中使用CopyManager从Collection快速插入postgresql DB

java - 有没有办法在不到 O(n) 的时间内连接 Java 字符串?

android - 如何对齐名称 :values pairs as ListView item

android - 让 MediaPlayer 和 AudioManager 通过耳机而不是扬声器播放?

android - 使用具有完全透明背景的 png 在 ImageView 下方着色 Artifact

python - sqlite3.ProgrammingError : Incorrect number of bindings supplied. 当前语句使用了1个,提供了5个