Android牛轧糖的SQLite查询不向后兼容



我有一个SQLite查询,返回_id在Android牛轧糖上的记录,但确实返回Android pre-Nougat上的记录。

当我将调试器连接到牛轧糖模拟器并开始探查时,我观察到以下内容:

原始代码

readableDatabase.query("report_view", null, "_id = ?", new String[]{"2016309001"}, null, null, null).getCount()

结果:0

readableDatabase.rawQuery("SELECT * FROM report_view WHERE _id = 2016309001", null).getCount()

结果:1

启用SQLite日志结果如下(注意单引号):

V/SQLiteStatements: /data/user/0/xyz/bla.db: "SELECT * FROM report_view WHERE _id = '2016309001'"

关于牛轧糖的非raw查询。我似乎无法在牛轧糖(棉花糖)设备上启用SQLite日志。

所以这个问题似乎是由Android用单引号包围参数引起的。_id柱类型为integer。用引号括起来的值是string类型。为什么这突然成为牛轧糖的问题?

除非我弄错了,否则你的原始代码将日期参数显式地传递为字符串(new string[]),并且Android文档中的查询方法,selectionargs参数状态

selectionArgs String:您可以在选择中包含?s,这将是替换为来自selectionArgs的值,按照它们出现的顺序在选择中。这些值将被绑定为string

所以如果你想要字符串以外的东西,你可能应该执行强制类型转换,或者更好的是,不要使用query和rawQuery方法,而是使用准备好的语句(SQLiteStatement),它将允许你指定参数的类型。

还有'?在日志中被替换应该是一个"假"的替换日志记录的目的(至少我希望这是一个假的替代日志记录的目的,因为Android应该使用一个绑定参数,而不是在查询中替换它)。

最后,Android中的字段类型仅用于类型亲和,所以完全有可能,即使你在表中声明字段为"整数",如果你使用Query方法和它的字符串参数,你实际上在记录中以字符串结束。

理论上,SQLite的行为不应该有什么不同。您可能正在使用不同的表定义,从而导致不同的关联。

无论如何,您给query函数的参数是一个字符串,因此数据库将其作为字符串处理也就不足为奇了。

如果你想给数据库一个数字,你必须使参数一个数字。Android框架不允许大多数数据库函数这样做,所以你必须把它直接放入字符串:

db.query("report_view", null, "_id = " + "2016309001", null, null, null, null).getCount();

请注意,有一个辅助函数用于计算行数:

DatabaseUtils.queryNumEntries(db, "report_view", "_id = " + "2016309001");

最新更新