【问题标题】:query sqlite database has outofboundException查询 sqlite 数据库有 outofboundException
【发布时间】:2021-02-19 21:28:34
【问题描述】:

我有一个ArrayList,我尝试将其转换为String[],以便查询我的数据库,但我得到outofboundException,但我不知道问题出在哪里?

将数组列表转换为字符串[]:

String[] idsArray = new String[selectedTopicIds.size()];
    idsArray = selectedTopicIds.toArray(idsArray);
    for (int i = 0; i < selectedTopicIds.size(); i++) {
        idsArray[i] = selectedTopicIds.get(i);
    }

然后我用Cursor来查询:

Cursor cursor = myDb.query(Util.TABLE_NAME,
            null,
            Util.KEY_TOPIC + "=?",
            idsArray,
            null,
            null,
            null);

这就是光标循环的方式:

if (cursor.moveToFirst()) {
        do {
            Word word = new Word();
            word.setId(cursor.getInt(0));
          
            wordList.add(word);

        } while (cursor.moveToNext());
    }
    cursor.close();

在我给它idsArray的线上我有这个例外:

java.lang.IllegalArgumentException:无法在索引 35 处绑定参数 因为索引超出范围。该语句有 1 个参数。

arraylist 和 String[] 都必须有 35 个从索引 0 到 34 的元素

我不明白问题出在哪里?

【问题讨论】:

  • 这意味着您的数组中的索引 35 不存在。因此,您的数组中没有足够的项目,并且您正在调用不存在的东西。
  • edit 您的问题并发布整个堆栈跟踪(请参阅 logcat)The statement has 1 parameters. 表示您的查询语句仅包含一个 ? 字符。
  • 我知道,但我怎样才能让我的光标不调用索引 35?
  • 我添加了光标循环功能
  • 索引 35 表示它要求第 36 个元素

标签: java android sql sqlite android-sqlite


【解决方案1】:

您是否尝试将列 Util.KEY_TOPIC 与数组 idsArray 的项目进行匹配?
如果是这样,则不应使用运算符=,而是使用运算符IN 并构造方法query()selection 参数,以便包含与idsArray 的项目数一样多的? 占位符.

一个更简单的方法是创建一个逗号分隔的idsArray 的所有项目列表,类似于",1,2,3"Arrays.toString()

String ids = Arrays.toString(idsArray).replaceAll("[\\[\\]]", ",").replace(" ", "");

并使用运算符LIKE:

Cursor cursor = myDb.query(
    Util.TABLE_NAME,
    null,
    "? LIKE '%,' || " + Util.KEY_TOPIC + " || ',%'",
    new String[] {ids},
    null,
    null,
    null
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    相关资源
    最近更新 更多