2017-08-29 61 views
1

我正在使用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,所以我卡住了?

+0

你要打电话让结果:FMResultSet =尝试database.executeQuery(查询,值:无),而不是让结果:FMResultSet =尝试database.executeStatments(),因为的executeQuery( )返回FMResultSet而executeStatments()返回布尔 –

回答

1
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 


    } 

尝试用这种

+0

忽略我以前的评论... try try database.executeQuery()的结果是一个布尔值,并将结果设置为::FMResultSet返回一个错误,我无法将'bool'转换为'FMResultSet' –

+0

你必须调用let results:FMResultSet = try database.executeQuery(query,values:nil)而不是let results:FMResultSet = try database.executeStatments(),因为executeQuery()返回FMResult executeStatments()返回布尔值时设置 –