【问题标题】:StringIndexOutOfBoundsException in SQLiteDatabase rawQuery()SQLiteDatabase rawQuery() 中的 StringIndexOutOfBoundsException
【发布时间】:2013-12-05 14:49:41
【问题描述】:

我无法绕过这个异常。我错过了什么明显的东西吗?

堆栈跟踪

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

【问题讨论】:

  • 是你的表名table?
  • SQL无效:table是表名需要反引号引起来,ANDGROUP BY之间没有表达式。但这些可能会导致其他一些异常。请在您进行查询的地方发布 Java 代码。

标签: java android sqlite sqlcipher


【解决方案1】:

导致StringIndexOutOfBoundsExceptioncode 如下。

/* 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 引号 (")、反引号 (`) 和方括号 ([])。

【讨论】:

  • 'AND' 是一个错字。但是,是的,我发现问题是一个空字符串
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      相关资源
      最近更新 更多