2017-11-19 2 views
0

aktualisieren auspackt:Swift4: FMDBdatabase - unerwartet gefunden null, während ein optionaler Wert

Am Ende gehe ich auf die lokale SQLite-Datenbank und den NULL-Wert zu „unkown“ ersetzen. Das funktioniert!

Ich benutze FMDatabaseQueue, um eine vorhandene SQLite-Datenbank in iOS zu suchen.

Leider gibt es einige "" Zeichenfolge in meiner Datenbank. Wie:

teacherName "" 

scoreValue "" 

Image of error database in Xcode

Während der Suche alarmierte Xcode dass

"Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value" in line "teacherName". 

Image of error

Ich brauche nicht diese "" Ergebnisse notwendigerweise, da sie nicht von Bedeutung sind. Wie kann ich es reparieren?

func queryDB(sql: String) -> NSMutableArray { 

    openDB(); 
    let resultArray = NSMutableArray() 

    SQLiteManager.shareInstance.dbQueue?.inDatabase { (db) in 
     let dbResult: FMResultSet! = db.executeQuery(sql, withArgumentsIn:[]) 

     if (dbResult != nil) 
     { 
      while dbResult.next() { 
       let model:scoreModel = scoreModel() 
       model.lessonName = String(dbResult.string(forColumn: "lessonName")!) 
       model.lessonCode = String(dbResult.string(forColumn: "lessonCode")!) 
       model.creditPoint = Double(dbResult.double(forColumn: "creditPoint")) 
       model.semesterName = String(dbResult.string(forColumn: "semesterName")!) 
       model.teacherName = String(dbResult.string(forColumn: "teacherName")!) 
       model.totalStudentNumber = Int(dbResult.int(forColumn: "totalStudentNumber")) 
       model.scoreValue = String(dbResult.string(forColumn: "scoreValue")!) 
       model.studentCount = Int(dbResult.int(forColumn: "studentCount")) 
       resultArray.add(model) 
      } 
     } 
    } 
    return resultArray 
} 

Vielen Dank!

Antwort

0

Das Problem ist, dass dbResult.string(forColumn: "teacherName") ein optionales mit einem Nullwert zurückgibt, also vielleicht dieses Objekt hatte einen Nullwert, wenn Sie es gespeichert haben. Es spielt keine Rolle, wie wichtig es ist, Objekte zu behandeln, die nicht alle Felder enthalten, die Sie erwarten. Die Frage, die Sie sich stellen müssen, lautet: "Wie soll ich mit dem Fall umgehen, in dem das Ding in der Datenbank keinen Lehrernamen hat?" Hier sind zwei Ideen:

Um als "gültig" betrachtet zu werden, muss alles in der Datenbank alle Eigenschaften haben, die ich erwarte, sonst ignoriere ich es. Das würde so aussehen:

while dbResult.next() { 
     if let lessonName = String(dbResult.string(forColumn: "lessonName")), 
     let lessonCode = String.dbResult.string(forColumn: "lessonCode")), 
     let creditPoint = Double(dbResult.double(forColumn: "creditPoint")), 
     let semesterName = String(dbResult.string(forColumn: "semesterName")), 
     let teacherName = String(dbResult.string(forColumn: "teacherName")), 
     let totalStudentNumber = Int(dbResult.int(forColumn: "totalStudentNumber")), 
     let scoreValue = String(dbResult.string(forColumn: "scoreValue")), 
     let studentCount = Int(dbResult.int(forColumn: "studentCount")) { 
      let model = scoreModel() 
      model.lessonName = lessonName 
      ...  // set lessonCode, etc 
      resultArray.add(model) 
     } 
    } 

andere Wahl ist mit Standardwerten optional koaleszierende oder ähnlich zu liefern.

while dbResult.next() { 
    let lessonName = String(dbResult.string(forColumn: "lessonName")) ?? "" 
    let lessonCode = String.dbResult.string(forColumn: "lessonCode")) ?? "" 
    let creditPoint = Double(dbResult.double(forColumn: "creditPoint")) ?? "" 
    let semesterName = String(dbResult.string(forColumn: "semesterName")) ?? "" 
    let teacherName = String(dbResult.string(forColumn: "teacherName")) ?? "" 
    let totalStudentNumber = Int(dbResult.int(forColumn: "totalStudentNumber")) ?? 0 
    let scoreValue = String(dbResult.string(forColumn: "scoreValue")) ?? "" 
    let studentCount = Int(dbResult.int(forColumn: "studentCount")) ?? 0 
    let model = scoreModel() 
    model.lessonName = lessonName 
    ...  // set lessonCode, etc 
    resultArray.add(model) 
} 
+0

Vielen Dank für Ihre großzügige Beratung. Am Ende gehe ich zur Sqlite-Datenbank und ersetze den NULL-Wert auf "unknown". –

+0

Ich weiß nicht, wie man Ergebnis in UTF8 umwandelt. Hinzufügen von utf8 in Zeichenfolge schien nicht funktioniert. Vielen Dank! –

+0

Was meinen Sie mit "Ergebnis in UTF8 konvertieren"? Welche Sache versuchen Sie zu konvertieren? – jefflovejapan

Verwandte Themen