无法从bool转换为为SQL查询结果设置的FMResult?

时间:2017-08-29 19:34:30

标签: swift sqlite fmdb

我正在利用FMDB作为将SQLite数据库集成到我的XCode项目中的一种方法。我一直关注this tutorial这个问题,而且在很大程度上它都非常出色。创建表并将对象插入表中一直很容易。但是,当尝试将查询结果从db保存到app中的变量时,我遇到了一些问题。这是我用于此期望过程的代码(包括变量类型的结构):

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,所以我被卡住了?

1 个答案:

答案 0 :(得分:1)

false

试试这个