【问题标题】:FMDatabase + swift + request with undefined number of argumentsFMDatabase + swift + 带有未定义参数数量的请求
【发布时间】: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 方法尚未正确转换。

标签: swift fmdb


【解决方案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://stackoverflow.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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 2015-02-27
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多