2014-12-03 65 views
0

我有问题的原始查询中的绑定参数值可能为空。 所以我接下来准备声明:Android的SQLite原始查询绑定

String ss="SELECT * FROM Table1 WHERE ifnull(column1,-1) = ? "; 

如果我执行它像我有,我没有得到任何结果

cursor = database.rawQuery(ss, new String[]{Long.toString(columnID)}); 

,但如果我手动替换问号这样的:

ss=ss.substring(0,ss.indexOf('?'))+Long.toString(columnID)+ss.substring(ss.indexOf('?')+1); 
cursor = database.rawQuery(ss, null); 

我得到正确的结果,做任何一个现在是什么原因呢?

+0

尝试在SS问号之后移除空间。有时SQLite对这些事情是非常明智的。 – 2014-12-03 16:15:53

+2

@CarlosJ在字符串之外,空间永远不会受到伤害。 – 2014-12-03 16:34:44

+0

请看我对这个问题的答案:https://stackoverflow.com/questions/41092903/use-blob-field-as-query-parameter-in-sqlite/47908283#47908283 – awattar 2017-12-20 14:39:38

回答

1

Android数据库API仅支持字符串作为参数,因此您的column1值不会被找到,除非它们是字符串。

普通整数没有格式问题,并不能导致SQL注入,这样你就可以直接与他们简单地写入到SQL查询:

String ss = "SELECT * FROM Table1 WHERE ifnull(column1,-1) = " + columnID; 
cursor = database.rawQuery(ss, null); 
+0

是的,我知道,但我转换长字符串,以便应该工作。如果我忽略空值,我做了这样的选择: String ss =“SELECT * FROM Table1 WHERE column1 =?”; 绑定完美地工作,但在这种情况下,空值将被忽略,并且如果我想要的话,我不会在数据库的column1上获得具有空值的行 – user2704821 2014-12-05 08:17:27

+0

NULL不能与'='进行比较,但这是一个不同的问题。 – 2014-12-05 09:09:21

+0

是的,我知道这一点,但我以前的评论指出,只是,龙的转换为字符串工作良好的绑定在第二种情况下,但不是在第一种情况下,当我有选择语句ifnull(column1,-1) – user2704821 2014-12-05 19:43:47