FMDatabase + swift +请求,带有未定义的参数数量

时间:2014-06-12 13:29:55

标签: swift fmdb

我试图通过Swift类向FMDB发送请求。

这是有效的:

self.database.executeQuery("SELECT * FROM foods WHERE id = ?", withArgumentsInArray:[anID])

因为我使用了方法 executeQuery(sql,withArgumentsInArray)

但我不知道如何将经典方法与未定义数量的参数一起使用,而不是使用带数组的方法:

self.database.executeUpdate(<#sql: String?#>, withVAList: <#CVaListPointer#>)

我不知道如何在 withVAList 中写下我的论据。

3 个答案:

答案 0 :(得分:5)

我的解决方案是创建一个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 :(得分:2)

问题是Swift不能使用带有可变数量参数的函数重载同名函数。因此,给出一个选择&#34;在理解您拨打executeUpdate作为executeUpdate:withArgumentsInArray:的来电和致电executeUpdate:(NSString*)...之间,后者永远不会成为可能。

但是,确实没有问题,因为你实际上从不需要调用该方法。除了通过使用内置的Swift executeUpdate:withVAList:函数(请参阅https://stackoverflow.com/a/24196063/341994)轻松调用getVaList,您可以轻松调用{<1}}。

甚至更好,只需使用executeUpdate:withArgumentsInArray:即可。如果没有参数,只需将nil传递给第二个参数。

答案 2 :(得分:0)

如果有帮助,我创建了一个优雅的SQLite库,完全用Swift编写,名为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
}

和'queries'(例如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