gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:25:15 25 4
gpt4 key购买 nike

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

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 应该会自动执行类型转换,但出了点问题,我不知道为什么。您对如何修复第一个代码示例有任何想法吗? (或者,也许是数据库?)

如果重要的话,这里是带有 id 字段的表的简化 CREATE 脚本:

CREATE TABLE SomeTable ( ID PRIMARY KEY, col1, col2, [...] )

更新:另外,getSID(db) 返回字符串对象。

最佳答案

查询参数只能是字符串是 Android 数据库 API 中一个可怕的设计错误。

不管文档怎么说,你应该只对实际的字符串值使用参数;整数值可以安全地直接嵌入到 SQL 字符串中。 (对于 blob,您必须使用接受 ContentValues 的函数。)

请注意,虽然 SQLite 使用 dynamic typing ,在大多数情况下,不同类型的值比较相等(SELECT 42='42'; 返回0)。在某些情况下,由于 type affinity,SQLite 确实自动转换值(在您的情况下,如果您将 id 列声明为 INTEGER,就会发生这种情况),但这是相当违反直觉的,因此不应依赖它。

关于android - SQLiteQueryBuilder 中的 selectionArgs 不适用于列中的整数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18013912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com