Android SQLite:哪个查询(“query”或“rawQuery”)更快?

Posted

技术标签:

【中文标题】Android SQLite:哪个查询(“query”或“rawQuery”)更快?【英文标题】:Android SQLite: Which query ("query" or "rawQuery") is faster? 【发布时间】:2012-02-08 11:40:48 【问题描述】:

我正在开发一个 android 数据库应用程序。我只想知道哪些代码执行得更快,它们之间有什么区别?

查询 - 1 =

db.rawQuery("select * from user_table where user_id =" + userId, null);

查询 - 2 =

db.query(USER_TABLE_NAME, ALL_COLUMNS, "user_id = " + userId, null, null, null, null);

【问题讨论】:

...试试看?对于所有意图和目的,我都会猜测“相同”。但是,请在任何一种情况下都使用占位符 如果您已经设置了构建系统,请对其进行一些基准测试。另外,您期望什么样的工作负载以及您希望在速度上获得什么样的优势? 【参考方案1】:

使用查询。

Android 预编译查询和使用太多不同的原始查询可能会导致性能问题。

仅在绝对需要时使用 rawQuery。

此外,您的两个示例都存在 SQL 注入的主要安全问题。

您应该清理 userId。

最明显的做法是让 Android 使用:

db.query(USER_TABLE_NAME, ALL_COLUMNS, "user_id = ?", new String[] userId, null, null, null);

【讨论】:

RE 预编译查询:仅在使用 PreparedStatement 时适用。 Query() 只是构建字符串并将其传递给 rawQuery()。 好吧,PreparedStatement 意味着多次运行同一个查询,没错,但我认为驱动程序也会执行某种优化。我在使用多个不同的 android 查询时遇到了一些错误,抱怨提供了太多的语句。 :) @JonAdams 请帮助我理解您的评论,“仅在使用preparedstatement 时适用”,我们在哪里使用preparedstatement 而rawQuery 可以实现同样的效果? (即你可以放 '?' 并传递参数?) @Darpan 是的,您仍然可以在所有查询类型中放置参数。我只是澄清一下这个答案中关于性能的部分并不完全正确。 @Darpan,有关准备好的语句的更多信息:***.com/a/29797229/3681880【参考方案2】:

查看 android 源代码中的 SQLiteDatabase.java 会发现 query(..) 最终调用 QueryBuilder 以将查询构建为单个字符串,然后它实质上调用 rawQuery()。它们应该大致等效,假设您也做了同样的工作来构建自己的语句。

【讨论】:

以上是关于Android SQLite:哪个查询(“query”或“rawQuery”)更快?的主要内容,如果未能解决你的问题,请参考以下文章

遍历来自 Sqlite-query 的行

sqlite学习1

检查查询是不是在 Android 的 sqlite 中成功

如何在 SQLite 查询中忽略重音(Android)

mysql,sqlite哪个好

如何找出在 Android 中发送到 SQLite 的查询?