我试图通过Swift类向FMDB发送请求。
这是有效的:
self.database.executeQuery("SELECT * FROM foods WHERE id = ?", withArgumentsInArray:[anID])
因为我使用了方法 executeQuery(sql,withArgumentsInArray)
但我不知道如何将经典方法与未定义数量的参数一起使用,而不是使用带数组的方法:
self.database.executeUpdate(<#sql: String?#>, withVAList: <#CVaListPointer#>)
我不知道如何在 withVAList 中写下我的论据。
答案 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。
它的一些功能是:
它提供了一种执行“更改”的简便方法(例如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