2017-08-29 4 views
1

J'utilise FMDB comme un moyen d'intégrer une base de données SQLite dans mon projet XCode. J'ai suivi this tutorial sur le sujet et il a été excellent, pour la plupart. Créer une table et insérer des objets dans la table a été indolore. Cependant, je rencontre un peu un problème lorsque vous essayez d'enregistrer les résultats interrogés de DB à une variable dans l'application. Voici le code que j'utilise pour ce processus souhaité (y compris le struct pour le type de la variable):Impossible de convertir bool en FMResult pour les résultats de requête 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 


    } 

Maintenant, la question que je suis actuellement en est pas nécessairement orienté logique flux. Je peux comprendre le processus et ce que les commandes essaient de faire. Le problème est plutôt avec la ligne let results = try database.executeStatements(query). Cette ligne est une copie quasi directe de celle trouvée sur la base de données susmentionnée, bien qu'elle soit la cause de l'erreur dans la ligne results.next() et la let messages = pulledMessage(...). Le .executeStatements signifie que les résultats ont le type bool. .next() ne peut pas être appelé sur le type bool et je ne peux pas non plus faire results.string ou autre. Bien que je comprenne la question, je ne sais pas comment l'amender. Puisque .executeStatements retournera un bool, et pas le résultat réel de la commande SQL select * from messages, comment puis-je définir results à tout type/objet que le tutoriel semble avoir prévu?

Editer: Je voudrais définir les résultats de la requête comme FMResultSet afin que je puisse utiliser .next() et affecter ma variable à certaines des propriétés du résultat. Cependant, la méthode pour laquelle j'ai essayé de le faire (visible dans le code que j'ai posté) est le réglage: let results: FMResultSet = try database.executeStatments(). Cela, cependant, me donne une erreur que je ne peux pas convertir un bool à un FMResultSet, donc je suis coincé?

+0

vous devez appeler laisser les résultats: fmresultset = essayer database.executeQuery (requête, valeurs: néant) au lieu de laisser les résultats: fmresultset = essayer database.executeStatments(), parce que executeQuery () renvoie FMResultSet tandis que executeStatments() renvoie Bool –

Répondre

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 


    } 

Essayez avec cette

+0

Ignorer mon commentaire précédent ... Le résultat de 'try database.executeQuery()' est un résultat de booléen et de réglage en tant que ': FMResultSet' renvoie une erreur que je ne peux pas convertir' bool' en 'FMResultSet' –

+0

vous devez appeler laisser les résultats: FMResultSet = try database.executeQuery (requête, valeurs: nil) au lieu de laisser les résultats: FMResultSet = try database.executeStatments(), car executeQuery() retourne FMResult Défini while executeStatments() retourne Bool –