我正在使用FMDB作为将SQLite数据库集成到我的XCode项目中的一种方法。我一直在关注这个问题this tutorial,而且大部分情况都非常好。创建一个表格并将对象插入表格一直很简单。但是,当尝试将查询结果从db保存到应用程序中的变量时,我遇到了一些问题。下面是我用这个希望的过程(包括结构的变量的类型)代码:无法从bool转换为FMResult为SQL查询结果设置?
struct pulledMessage{
var userIDs: String
var userNames: String
var message: String
var sender: String
var messageNumber: Int
}
func loadMessageData() -> [pulledMessage]!{
var messagesPulled: [pulledMessage]!
if openDatabase(){//correctly opens the database
let query = "select * from messages order by messageNumber asc"
do{
print(database)
let results: FMResultSet = try database.executeStatements(query)
//^statement above causes error
//The type FMResultSet is not usable for some reason
while results.next(){
let message = pulledMessage(userIDs: String(results.string(forColumn: "userIDs")), userNames: String(results.string(forColumn: "userNames")), message: String(results.string(forColumn: "message")), sender: String(results.string(forColumn: "sender")), messageNumber: Int(results.string(forColumn: "messageNumber")))
if messagesPulled == nil{
messagesPulled = [pulledMessage]()
}
messagesPulled.append(contentsOf: message)
}
}
catch{
print(error.localizedDescription)
}
database.close()
}
return messagesPulled
}
现在,我目前运行到这个问题并不一定是逻辑流为主。我可以理解这个过程以及这些命令正在尝试做什么。这个问题相当于let results = try database.executeStatements(query)
。该行是上述数据库中找到的行的近似直接副本,但它是results.next()
行和let messages = pulledMessage(...)
中的错误原因。 .executeStatements
表示结果的类型为bool
。 .next()
不能在类型bool
上调用,我也不能做results.string
或其他。虽然我理解这个问题,但我不知道如何修改它。由于.executeStatements
将返回bool
,而不是select * from messages
SQL命令的实际结果,因此如何将results
设置为本教程似乎预期的任何类型/对象?
编辑:我想将查询结果设置为FMResultSet
,这样我就可以使用.next()
并将我的变量分配给某些结果的属性。然而,我试图这样做的方法(可以在我发布的代码中查看)设置为:let results: FMResultSet = try database.executeStatments()
。但是,这给了我一个错误,我无法将bool转换为FMResultSet,所以我卡住了?
你要打电话让结果:FMResultSet =尝试database.executeQuery(查询,值:无),而不是让结果:FMResultSet =尝试database.executeStatments(),因为的executeQuery( )返回FMResultSet而executeStatments()返回布尔 –