【问题标题】:sqllite3 bind to text swift projectsqlite3 绑定到文本快速项目
【发布时间】:2018-03-22 20:58:33
【问题描述】:

我在 xcode swift 项目中访问 sqlite3 数据库时遇到问题。特别是当将准备好的 sql 语句中的主机参数绑定到文本(字符串)值时,绑定总是绑定所有?而不仅仅是一个。所以结果不是预期的。 (注意:我只是使用带有指定桥接头文件的内置 sqlite3 库,而不是任何第 3 方包装器)

例如:我的测试数据库表有一个名为 str1 的列,其值为“2010”、“2011”等年份(不是整数,而是字符串)。如果我使用 SQL 语句:

SELECT * FROM table1 WHERE str1 BETWEEN '2011' AND '2012'

它为我提供了我期望得到的所有行。但是如果我使用语句:

SELECT * FROM table1 WHERE str1 BETWEEN ? AND ?

并将准备好的语句绑定到:

sqlite3_bind_text(statement, 1, "2011", -1, nil)
sqlite3_bind_text(statement, 2, "2012", -1, nil)

它只返回“2012”的行。准备工作已完成:

sqlite3_prepare_v2(db, sql, -1, &statement, tail)

所以,绑定有点工作,但它似乎总是替换 ALL ?与价值,而不仅仅是一个。 (如果我使用唯一的参数名称,例如 ?1 和 ?2 而不仅仅是 ? ?,它的工作原理没有什么不同)

那么,我的问题是:如何将 sqlite3 主机参数绑定到 Swift 字符串值?

【问题讨论】:

    标签: swift sqlite


    【解决方案1】:

    查看GRDB.swift的源代码(https://github.com/groue/GRDB.swift/blob/v2.9.0/GRDB/Core/Statement.swift#L179和https://github.com/groue/GRDB.swift/blob/v2.9.0/GRDB/Core/Database.swift#L14)我认为下面的代码可以工作:

    let SQLITE_TRANSIENT = unsafeBitCast(OpaquePointer(bitPattern: -1), to: sqlite3_destructor_type.self)
    sqlite3_bind_text(statement, index, string, -1, SQLITE_TRANSIENT)
    

    【讨论】:

      猜你喜欢
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      • 2017-06-20
      相关资源
      最近更新 更多