【发布时间】: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