sqllite3绑定到文本swift项目

时间:2015-12-22 18:53:20

标签: swift sqlite

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

例如:我的测试数据库表有一个名为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字符串值?

1 个答案:

答案 0 :(得分:1)

查看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)