正如 Android 文档所说,rawQuery 方法的 selectionArgs 参数被解析为字符串。
SQLiteDatabase.rawQuery(String sql, String[] selectionArgs)
selectionArgs:您可以在查询的 where 子句中包含 ?s,它将被 selectionArgs 中的值替换。这些值将绑定为字符串。
但是今天,我遇到了一个问题,这个问题占据了我大部分时间。想象以下查询:
SELECT * FROM TABLE_A WHERE IFNULL(COLUMN_A, 0) >= 15
COLUMN_A 是整数。该表有大约 10 行符合该标准。在数据库编辑器上运行查询,结果总是正确的,但在智能手机上,语句总是不返回任何行。
一段时间后,a 将查询更改为:
SELECT * FROM TABLE_A WHERE IFNULL(COLUMN_A, 0) >= '15'
并且编辑器没有返回任何行,就像 Android 一样。因此,将查询更改为:
SELECT * FROM TABLE_A WHERE CAST(IFNULL(COLUMN_A, 0) as INTEGER) >= '15'
解决了这个问题。进行的另一项测试是:
SELECT * FROM TABLE_A WHERE COLUMN_A >= '15'
此外,返回了正确的结果。
这似乎是一个问题,涉及 Android 使用 IFNULL 子句将参数绑定到查询(作为字符串)的方式。
那么,有人知道为什么会这样吗?有什么建议可以在不使用 CAST 的情况下解决这个问题吗?