我正在尝试从数据库中选择一些数据,我有两片代码来做:
cursor = builder.query(db,new String[]{"col1","col2","col3"},"id = ?",new String[]{getSID(db)},null,null);
和
cursor = builder.query(db,"id = " + getSID(db),null);
它们之间的区别在于,根据文档,第一个似乎更正确,但它也不起作用 – 光标是空的.而不是第二个 – 我得到了我需要的所有数据.
所以我尝试在我的电脑上使用数据库副本执行不同的SQL查询,这就是我所拥有的:
SELECT col1,col2,col3 FROM SoMetables WHERE (id = '42')
SELECT col1,col3 FROM SoMetables WHERE (id = 42)
据我所知,sqlite应该自动执行类型转换,但出了点问题,我不知道为什么.您对如何修复第一个代码示例有什么想法吗? (或者,也许,数据库?)
如果重要,这里是带有id字段的表的简化CREATE脚本:
CREATE TABLE SoMetable ( ID PRIMARY KEY,col1,[...] )
UPD:顺便说一下,getSID(db)返回String Object.
解决方法
那个查询参数只能是字符串,这是Android数据库API中一个可怕的设计错误.
尽管文档说的是,但您应该仅将参数用于实际的字符串值;整数值可以安全地直接嵌入到sql字符串中. (对于blob,您必须使用接受ContentValues的函数.)
请注意,虽然sqlite使用dynamic typing,但在大多数情况下,不同类型的值不相等(SELECT 42 =’42’;返回0).
在某些情况下,sqlite会自动转换由于type affinity引起的值(在您的情况下,如果您将id列声明为INTEGER,则会发生这种情况),但这是违反直觉的,因此不应该依赖它.