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é?
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 –