小编典典

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

sql

我正在尝试从数据库中选择一些数据,但我有两段代码可以做到这一点:

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 TABLE SomeTable ( ID PRIMARY KEY, col1, col2, [...] )

UPD: 并且,顺便说一句,getSID(db)返回字符串对象。


阅读 194

收藏
2021-03-17

共1个答案

小编典典

根据SQLite文档

除了INTEGER PRIMARY KEY列外,SQLite版本3数据库中的任何列均可用于存储任何存储类的值。

在我的情况下,这意味着我们不能确定将哪种数据类型存储在列中。如果可以在将数据类型放入数据库时​​进行控制和转换,则可以将id值转换为TEXT将数据添加到数据库时的值,并且selectionArgs易于使用。但这不是我的问题的答案,因为我必须按原样处理数据库内容。

因此,可能的解决方案:

a)将整数值嵌入selection字符串中,而不将它们包装到'

cursor = builder.query(db,
                    new String[]{"col1", "col2", "col3"},
                    "id = " + getSID(db), null, null, null, null);

b)从selectionArgs:CAST(? as INTEGER)或强制转换值CAST(id AS TEXT)。我认为,将column转换TEXT为更好的解决方案,因为right操作数始终是TEXT,而left操作数可以是任何值。所以:

cursor = builder.query(db,
                    new String[]{"col1", "col2", "col3"},
                    "CAST(id AS TEXT) = ?", 
                    new String[]{getSID(db)}, null, null, null);
2021-03-17