2017-08-29 62 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()返回布爾值時設置 –