【问题标题】:SQLite rawquery fails to match expected stringsSQLite rawquery 无法匹配预期的字符串
【发布时间】:2016-10-31 12:49:08
【问题描述】:

我正在使用这种方法进行简单的数据库搜索。

public Cursor queryExpense(String createdDate, String createdTime, String category, String description, String amount) {
    SQLiteDatabase db = this.getReadableDatabase();
    String query = "SELECT * FROM " + TABLE_NAME + " WHERE " + COLUMN_DATE + " LIKE ? AND " + COLUMN_TIME + " LIKE ? AND " +
            COLUMN_CATEGORY + " LIKE ? AND " + COLUMN_DESCRIPTION + " LIKE ? AND " + COLUMN_AMOUNT + " LIKE ? ";
    String mDate = createdDate.length() > 0 ? "%" + createdDate + "%" : "%";
    String mTime = createdTime.length() > 0 ? "%"  + createdTime + "%" : "%";
    String mCategory = category.length() > 0 ? "%" + category + "%" : "%";
    String mDescription = description.length() > 0 ? "%"  + description + "%" : "%";
    String mAmount = amount.length() > 0 ? "%"  + amount + "%" : "%";

    Log.d("Parameters",mDate + "," + mTime + "," + mCategory + "," + mDescription + "," + mAmount);

    return db.rawQuery( query, new String[] { mDate, mTime, mCategory, mDescription, mAmount } );
}
}

当没有传递任何值时(所有字段都是“%”),结果之一就是这条记录:

Date: 30/10/2016
Time: 6:56:41
Category: Food
Description: Lunch at Nosh
Amount: 25

但是,当将描述指定为“unc”时,不会出现相同的记录。调试日志显示了预期的参数和 SQL,所以我不确定为什么这不是结果。

SELECT * FROM expenses where createdDate like ? and createdTime like ? and category like ? and description like ? and amount like ?
[%,%,%,%unc%,%]

我错过了什么?

编辑:问题已解决

感谢@laalto,我发现问题是由于同时存在 Cursor.moveToFirst 和 Cursor.moveToNext,因此搜索可能跳过了一个结果。

【问题讨论】:

  • 对我来说,代码看起来像你真的匹配unc% 而不是%unc%,因为你只在最后添加了%。但是没有解释调试输出。
  • 啊我实际上匹配任何子字符串。我错过了代码中每个字段的前导 %。现已编辑。
  • @laalto 奇怪的是,以这种方式搜索时,表中的某些行很好。尽管我没有看到任何模式,但这似乎只是某些行的问题。
  • FWIW,插入表格的第一行没有出现在任何结果中。
  • 那你用光标做什么呢?如果您同时拥有moveToFirst()moveToNext(),它将跳过第一行。

标签: android database sqlite wildcard


【解决方案1】:

基于问题 cmets:查询很好,与预期的行匹配。

问题在于读取返回的Cursor。像

这样的构造
if (cursor.moveToFirst()) {
    while (cursor.moveToNext()) {
        //...
    }
}

跳过第一个结果行,这是唯一返回的具有更具体选择标准的行。

遍历游标的惯用模式是:

if (cursor.moveToFirst()) {
    do {
        //...
    } while (cursor.moveToNext());
}

【讨论】:

  • 完美!谢谢。
猜你喜欢
  • 2013-04-17
  • 1970-01-01
  • 2016-07-03
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多