FMDatabase + swift + 带有未定义参数数量的请求
Posted
技术标签:
【中文标题】FMDatabase + swift + 带有未定义参数数量的请求【英文标题】:FMDatabase + swift + request with undefined number of arguments 【发布时间】:2014-06-12 13:29:55 【问题描述】:我正在尝试通过 Swift 类向 FMDB 发送请求。
这是有效的:
self.database.executeQuery("SELECT * FROM foods WHERE id = ?", withArgumentsInArray:[anID])
因为我使用了方法executeQuery(sql, withArgumentsInArray)
但我不知道如何使用带有未定义数量参数的经典方法,而不是带有数组的方法:
self.database.executeUpdate(<#sql: String?#>, withVAList: <#CVaListPointer#>)
我不知道如何在 withVAList 中编写我的论点。
【问题讨论】:
我认为带有可变参数列表的 Obj-C 方法尚未正确转换。 【参考方案1】:我的解决方案是创建一个 FMDatabase 包装器:
let success:Bool = FMDatabaseWrapper().executeUpdate(sql, food.ID?, food.name?)
func executeUpdate(sql:String, _ arguments: AnyObject?...) -> Bool
return database.executeUpdate(sql, withArgumentsInArray:arguments as NSArray)
有效。
【讨论】:
+1 您可以将此方法作为extension
添加到FMDatabase
,这是无缝的。不过,您可能不希望将 AnyObject
设为可选。
而且,不用说,可以对executeQuery
执行等效的方法,例如:func executeQuery(sql:String, _ arguments: AnyObject...) -> FMResultSet? return executeQuery(sql, withArgumentsInArray: arguments as NSArray);
(对于丑陋的格式感到抱歉)。【参考方案2】:
问题是 Swift 不能用带有可变数量参数的函数重载同名函数。因此,如果在将您对executeUpdate
的调用理解为对executeUpdate:withArgumentsInArray:
的调用和对executeUpdate:(NSString*)...
的调用之间做出“选择”,则后者永远不会出现。
但是,实际上没有问题,因为您实际上不需要调用该方法。除了调用executeUpdate:withVAList:
,它什么都不做,您可以使用内置的Swift getVaList
函数轻松地自己直接调用它(参见https://***.com/a/24196063/341994)。
或者更好,直接使用executeUpdate:withArgumentsInArray:
。如果没有参数,只需将nil
传递给第二个参数。
【讨论】:
【参考方案3】:如果有帮助,我创建了一个完全用 Swift 编写的优雅的 SQLite 库,名为 SwiftData。
它的一些特点是:
方便地将对象绑定到 SQL 字符串 支持事务和保存点 内联错误处理 默认完全线程安全它提供了一种简单的方法来执行“更改”(例如 INSERT、UPDATE、DELETE 等):
if let err = SD.executeChange("INSERT INTO Cities (Name, Population, IsWarm, FoundedIn) VALUES ('Toronto', 2615060, 0, '1793-08-27')")
//there was an error during the insert, handle it here
else
//no error, the row was inserted successfully
和“查询”(例如 SELECT):
let (resultSet, err) = SD.executeQuery("SELECT * FROM Cities")
if err != nil
//there was an error during the query, handle it here
else
for row in resultSet
if let name = row["Name"].asString()
println("The City name is: \(name)")
if let population = row["Population"].asInt()
println("The population is: \(population)")
if let isWarm = row["IsWarm"].asBool()
if isWarm
println("The city is warm")
else
println("The city is cold")
if let foundedIn = row["FoundedIn"].asDate()
println("The city was founded in: \(foundedIn)")
还有更多功能!
您可以查看here
【讨论】:
以上是关于FMDatabase + swift + 带有未定义参数数量的请求的主要内容,如果未能解决你的问题,请参考以下文章
req.session 未定义和 req.session.user_id 不工作