2017-08-29 2 views
1

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?

+0

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 –

Antwort

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 


    } 

Versuchen mit diesem

+0

Ignoriere meinen vorherigen Kommentar ... Das Ergebnis von 'try database.executeQuery()' ist ein bool- und Einstellungsergebnis, da ': FMResultSet' einen Fehler zurückgibt, den ich' bool' nicht konvertieren kann 'FMResultSet' –

+0

Sie müssen Ergebnisse aufrufen: FMResultSet = try datenbank.executeQuery (Abfrage, Werte: Nil) statt Let Ergebnisse: FMResultSet = versuchen Sie Datenbank.ExecuteStatments(), weil executeQuery() FMResult zurückgibt Set, während executeStatments() Bool zurückgibt –

Verwandte Themen