gpt4 book ai didi

swift - sqlite3绑定(bind)到文本swift项目

转载 作者:行者123 更新时间:2023-12-03 18:47:40 30 4
gpt4 key购买 nike

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

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

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

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

SELECT * FROM table1 WHERE str1 BETWEEN ? AND ?

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

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)

所以,绑定(bind)有点工作,但它似乎总是取代 ALL ?具有值(value)而不仅仅是一个。 (如果我使用唯一的参数名称,例如 ?1 和 ?2 而不是只是 ? ?,它的工作方式没有什么不同)

所以,我的问题是:如何将 sqlite3 主机参数绑定(bind)到 Swift 字符串值?

最佳答案

查看 GRDB.swift 的源代码(https://github.com/groue/GRDB.swift/blob/v2.9.0/GRDB/Core/Statement.swift#L179https://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)

关于swift - sqlite3绑定(bind)到文本swift项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34422597/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com