android –SQLiteQueryBuilder中的selectionArgs不适用于列中的整数值

我正在尝试从数据库中选择一些数据,我有两片代码来做:
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,则会发生这种情况),但这是违反直觉的,因此不应该依赖它.

相关文章

这篇“android轻量级无侵入式管理数据库自动升级组件怎么实现...
今天小编给大家分享一下Android实现自定义圆形进度条的常用方...
这篇文章主要讲解了“Android如何解决字符对齐问题”,文中的...
这篇文章主要介绍“Android岛屿数量算法怎么使用”的相关知识...
本篇内容主要讲解“Android如何开发MQTT协议的模型及通信”,...
本文小编为大家详细介绍“Android数据压缩的方法是什么”,内...