Ich verwende FMDB als eine Möglichkeit, eine SQLite-Datenbank in mein XCode-Projekt zu integrieren. Ich habe this tutorial über die Angelegenheit verfolgt und es war zum größten Teil ausgezeichnet. Es war schmerzlos, eine Tabelle zu erstellen und Objekte in die Tabelle einzufügen. Allerdings habe ich ein kleines Problem, wenn ich versuche, abgefragte Ergebnisse von db auf eine Variable in app zu speichern. Hier ist der Code, den ich für diesen gewünschten Prozess verwenden (einschließlich der Struktur für den Typ der Variable):Kann nicht von bool in FMResult für SQL-Abfrageergebnisse konvertieren?
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
}
Nun ist die Frage, die ich zur Zeit in leite ist nicht unbedingt logisch Fluss ausgerichtet. Ich kann den Prozess und die Befehle verstehen. Das Problem ist eher mit der Zeile let results = try database.executeStatements(query)
. Diese Zeile ist eine fast direkte Kopie der in der oben erwähnten Datenbank gefundenen Zeile, obwohl sie die Ursache für den Fehler in der Zeile results.next()
und let messages = pulledMessage(...)
ist. Die .executeStatements
bedeutet, dass die Ergebnisse den Typ bool
haben. .next()
kann nicht am Typ bool
und ich kann auch nicht results.string
oder was auch immer. Obwohl ich das Problem verstehe, weiß ich nicht, wie ich es ändern soll. Da .executeStatements
wird eine bool
, und nicht das eigentliche Ergebnis der select * from messages
SQL-Befehl zurück, wie kann ich results
auf welchen Typ/Objekt, das das Tutorial scheint, festgelegt haben?
Bearbeiten: Ich möchte die Ergebnisse der Abfrage als FMResultSet
festlegen, so dass ich .next()
verwenden und meine Variable einigen der Eigenschaften des Ergebnisses zuweisen kann. Die Methode, für die ich das versucht habe (sichtbar im Code, den ich gepostet habe), lautet jedoch: let results: FMResultSet = try database.executeStatments()
. Dies gibt mir jedoch einen Fehler, dass ich ein Bool nicht in ein FMResultSet konvertieren kann, also bin ich fest?
Sie lassen Ergebnisse verlangen: fmresultset = versuchen database.executeQuery (Abfrage, Werte: Null) anstelle Ergebnisse lassen: fmresultset = versuchen database.executeStatments(), weil executeQuery () gibt FMResultSet zurück, während executeStatments() Bool zurückgibt –