Android中的Sqlite奇怪的rawQuery行为

Posted

技术标签:

【中文标题】Android中的Sqlite奇怪的rawQuery行为【英文标题】:Sqlite weird rawQuery behavior in Android 【发布时间】:2012-05-16 02:45:01 【问题描述】:

我使用 SQLiteDatabase 对象的 rawQuery 方法。

当我写作时

db.rawQuery("select * from xxx order by ? desc;", new String[] "edit_time");

它不会对结果排序。

但是当我写的时候

db.rawQuery("select * from xxx order by edit_time desc;", null);

它命令。

我做错了什么?


感谢桑迪斯,我发现我误读了文档。不应该有“;”。但删除“;”好像没什么影响。

【问题讨论】:

当您将内容放入选择参数中时,它们被绑定为字符串,它们不会自动成为 SQL 的一部分。如果要使排序变量将字符串与要排序的列连接起来。 @Jens 我无法选择评论作为正确答案,所以... 【参考方案1】:

documentation 指定了"The SQL string must not be ; terminated",也许这就是你的问题的根源。

【讨论】:

刚刚测试过。有或没有;,第二个有效,第一个无效。 要明确一点,如果删除 desc 后的分号,第一个不起作用?如果是这样的话,我对地狱的回答就打破了这个理论。【参考方案2】:

正如 Jens 所说的第一个问题:

db.rawQuery("select * from xxx order by ? desc;", new String[] "edit_time"); 

变成:

select * from xxx order by 'edit_time' desc

由于我们不关心列名上的 SQL 注入,您应该使用:

db.rawQuery("select * from xxx order by edit_time desc", null);

selectionArgs 旨在以这种方式使用:

db.rawQuery("select * from xxx order by edit_time like ? desc", new String[]  "%" + orderBy + "%");

【讨论】:

以上是关于Android中的Sqlite奇怪的rawQuery行为的主要内容,如果未能解决你的问题,请参考以下文章

android设备监视器屏幕显示这个奇怪的空白屏幕,没有任何工作

SQLite数据库及在Android开发中的基本使用

ListView来自android中的Sqlite

详解Android中的SQLite数据库存储

如何从android中的sqlite中检索数据

Android:SQLite 中的自定义排序规则