【问题标题】:SQLiteStatement why no method for SELECT statement - any workaround plus why no thread safeSQLiteStatement 为什么没有 SELECT 语句的方法 - 任何解决方法以及为什么没有线程安全
【发布时间】:2013-10-09 22:21:42
【问题描述】:

您是否知道任何解决方法如何预编译返回 Cursor 的 SELECT 语句并多次使用它(我 99% 确定使用 sqlite 是可能的,因为 java 桌面驱动程序允许使用 SELECT 返回游标进行预编译)?不幸的是,作为源,我不能使用 QueryBuilder,而是使用纯 SQL 字符串类型的 SELECT 语句(使用 ? 作为参数)。由于效率,预编译会很棒。

另外,在实践中 SQLiteStatement 不是线程安全的意味着什么?我怎样才能将其替换为线程安全且高效(预编译)?

【问题讨论】:

  • 我想知道是否有任何方法可以从 sqlite 命令行预编译 sqlite 语句?也许这将是一些方向......但不幸的是,我无法找到任何用于预编译的 sqlite 本机命令。 :(
  • 重新处理线程安全问题 - 如果我有两个不同的连接到同一个数据库并且我将使用 SQLiteStatement,那是否安全(在多线程程序中)?
  • 如果您有 2 个不同的 SQLiteStatement 实例,它应该可以正常工作。

标签: java android sqlite


【解决方案1】:

要预编译语句,请使用compileStatement function

SQLiteStatement stmt = db.compileStatement("SELECT X FROM Y WHERE Z = ?");
...
stmt.bindString(1, "foo");
String x = stmt.simpleQueryForString();

不幸的是,不可能从这样的预编译语句中返回游标。 如果要获取多行或多列,则必须使用queryrawQuery

请注意,SQLite 相当快;除非您实际将其衡量为应用程序的瓶颈,否则您不应费心优化语句编译。

【讨论】:

  • 是的,我注意到对于简单的查询,但我需要将它用于返回光标的相当复杂的语句。我的问题从这里开始......预编译语句没有光标返回函数。
【解决方案2】:

我不清楚使用可替换参数(? 占位符)预编译 SELECT 是否比使用 SQLiteDatabase.query() 发出查询更有效。是什么导致您相信您需要编译该声明?

【讨论】:

  • 如果您只使用相同的 SELECT 一次,可能没有区别,甚至使用预编译语句可能需要更多时间。如果您使用类似的选择 ex。每 1 秒 1000 次,使用不同的参数(?)会有所不同。
【解决方案3】:

我认为rawQuery() 可能会在内部预编译该语句。

与支持更多数据类型的SQLiteStatement 相比,参数必须转换为字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多