Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 参数化SQLite查询的奇怪行为_Android_Sql_Sqlite_Parameterized Query - Fatal编程技术网

Android 参数化SQLite查询的奇怪行为

Android 参数化SQLite查询的奇怪行为,android,sql,sqlite,parameterized-query,Android,Sql,Sqlite,Parameterized Query,如果你能想出更好的方法,请随意改进问题标题 问题:考虑以下SQLite查询: SELECT COUNT(*) FROM (SELECT 1 AS value UNION SELECT 2 AS value) WHERE value <= ? 这可能与参数作为字符串传递有关,但是,唉,没有其他方法可以将参数传递给SQLite API,因此我想我在这里没有做错任何事情,SQLite的工作就是正确地转换值。在使用非参数化版本的查询时,我还观察到以下情况,这可能与问题有关,也可能与问题无关

如果你能想出更好的方法,请随意改进问题标题

问题:考虑以下SQLite查询:

SELECT COUNT(*)
  FROM (SELECT 1 AS value UNION SELECT 2 AS value)
 WHERE value <= ?
这可能与参数作为字符串传递有关,但是,唉,没有其他方法可以将参数传递给SQLite API,因此我想我在这里没有做错任何事情,SQLite的工作就是正确地转换值。在使用非参数化版本的查询时,我还观察到以下情况,这可能与问题有关,也可能与问题无关:

SELECT COUNT(*)
  FROM (SELECT 1 AS value UNION SELECT 2 AS value)
 WHERE value <= 1              -- yields 1

SELECT COUNT(*)
  FROM (SELECT 1 AS value UNION SELECT 2 AS value)
 WHERE value <= '1'            -- yields 2
rawQuery文档中说:

[…]您可以在查询中的where子句中包含?s,该子句将被selectionArgs中的值替换。这些值将被绑定为字符串

并引用:

比较的结果取决于 操作数,根据以下规则[…]

整数或实数值小于任何文本或BLOB值。 因为1和2都是整数,所以它们都小于“1”文本值。这就是为什么这句话:

SELECT 2 <= '1'
。。。在SQLite中返回1

你可能应该使用

WHERE value <= CAST('1' AS INTEGER)

。。。相反或者,您可以使用这样一个事实,即所有数学运算符都将两个操作数强制转换为数值存储类,其中的值可能为。您可以使用选择“1”和选择“2”,就是这样,谢谢!所以,参数的自动类型调整只在将它们直接和数据库列进行比较时起作用。。。很高兴知道。
WHERE value <= CAST('1' AS INTEGER)
SELECT * FROM myTable WHERE _id < ?