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...) -&gt; 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 + 带有未定义参数数量的请求的主要内容,如果未能解决你的问题,请参考以下文章

扩展目标 c 类报告“使用未声明的类型”

未定义子或函数过程

req.session 未定义和 req.session.user_id 不工作

iPhone,FMDatabase:executeQuery 不起作用

使用 Swift + FMDB 打开和关闭数据库

通过 FMDatabase 读写 NSDate 到 sqlite 数据库