无法将 SQL 查询结果的布尔值转换为 FMResult 集?
Cannot convert from bool to FMResult set for SQL query results?
我正在利用 FMDB 将 SQLite 数据库集成到我的 XCode 项目中。我一直在关注 this tutorial 此事,大部分情况下都非常好。创建一个 table 并将对象插入 table 是很轻松的。但是,当我尝试将查询结果从数据库保存到应用程序中的变量时,我 运行 遇到了一些问题。这是我用于此所需过程的代码(包括变量类型的结构):
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
将 return 变成 bool
,而不是 select * from messages
SQL 命令的实际结果,我如何将 results
设置为任何 type/object教程似乎有意?
编辑:我想将查询结果设置为 FMResultSet
以便我可以使用 .next()
并将我的变量分配给某些结果的属性。但是,我尝试这样做的方法(在我发布的代码中可见)是设置:let results: FMResultSet = try database.executeStatments()
。但是,这给了我一个错误,我无法将 bool 转换为 FMResultSet,所以我卡住了?
func loadMessageData() -> [pulledMessage]!{
var messagesPulled: [pulledMessage]!
if openDatabase(){
let query = "select * from messages order by messageNumber asc"
do{
print(database)
let results:FMResultSet = try database.executeQuery(query, values: nil)
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
}
试试这个
我正在利用 FMDB 将 SQLite 数据库集成到我的 XCode 项目中。我一直在关注 this tutorial 此事,大部分情况下都非常好。创建一个 table 并将对象插入 table 是很轻松的。但是,当我尝试将查询结果从数据库保存到应用程序中的变量时,我 运行 遇到了一些问题。这是我用于此所需过程的代码(包括变量类型的结构):
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
将 return 变成 bool
,而不是 select * from messages
SQL 命令的实际结果,我如何将 results
设置为任何 type/object教程似乎有意?
编辑:我想将查询结果设置为 FMResultSet
以便我可以使用 .next()
并将我的变量分配给某些结果的属性。但是,我尝试这样做的方法(在我发布的代码中可见)是设置:let results: FMResultSet = try database.executeStatments()
。但是,这给了我一个错误,我无法将 bool 转换为 FMResultSet,所以我卡住了?
func loadMessageData() -> [pulledMessage]!{
var messagesPulled: [pulledMessage]!
if openDatabase(){
let query = "select * from messages order by messageNumber asc"
do{
print(database)
let results:FMResultSet = try database.executeQuery(query, values: nil)
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
}
试试这个