我正在尝试从数据库中选择一些数据,但我有两段代码可以做到这一点:
cursor = builder.query(db, new String[]{"col1", "col2", "col3"}, "id = ?", new String[]{getSID(db)}, null, null, null);
和
cursor = builder.query(db, new String[]{"col1", "col2", "col3"}, "id = " + getSID(db), null, null, null, null);
它们之间的区别在于,根据文档,第一个似乎更正确,但它也不起作用-光标为空。而不是第二个-我正在获取所需的所有数据。
因此,我尝试在PC上使用数据库副本执行不同的SQL查询,这就是我所拥有的:
SELECT col1, col2, col3 FROM SomeTables WHERE (id = '42')
该查询无效(该查询显然等于由第一个代码示例生成的查询)
SELECT col1, col2, col3 FROM SomeTables WHERE (id = 42)
并且这一方法工作正常(等于从第二个代码示例进行查询)。
据我所知,SQLite应该自动执行类型转换,但是出了点问题,我也不知道为什么。您对如何解决第一个代码示例有什么想法?(或者,也许是数据库?)
如果重要的话,CREATE下面是带有id字段的表格的简化脚本:
CREATE
id
CREATE TABLE SomeTable ( ID PRIMARY KEY, col1, col2, [...] )
UPD: 并且,顺便说一句,getSID(db)返回字符串对象。
根据SQLite文档,
除了INTEGER PRIMARY KEY列外,SQLite版本3数据库中的任何列均可用于存储任何存储类的值。
在我的情况下,这意味着我们不能确定将哪种数据类型存储在列中。如果可以在将数据类型放入数据库时进行控制和转换,则可以将id值转换为TEXT将数据添加到数据库时的值,并且selectionArgs易于使用。但这不是我的问题的答案,因为我必须按原样处理数据库内容。
TEXT
selectionArgs
因此,可能的解决方案:
a)将整数值嵌入selection字符串中,而不将它们包装到':
selection
'
b)从selectionArgs:CAST(? as INTEGER)或强制转换值CAST(id AS TEXT)。我认为,将column转换TEXT为更好的解决方案,因为right操作数始终是TEXT,而left操作数可以是任何值。所以:
CAST(? as INTEGER)
CAST(id AS TEXT)
cursor = builder.query(db, new String[]{"col1", "col2", "col3"}, "CAST(id AS TEXT) = ?", new String[]{getSID(db)}, null, null, null);