在SQLite DB中返回行时,“在解包可选值时意外发现nil”错误

时间:2016-02-15 00:56:16

标签: swift sqlite fmdb

我已经将FMDB Sqlite Wrapper集成到我的iOS应用程序中,并且我编写了几个DB函数,这些函数到目前为止都运行良好。

我使用相同的方法来处理一个简单的方法,该方法应该返回Resultset项中的单个元素,但是我得到了上面的错误。逻辑与其他方法没有什么不同,所以我不知道为什么会出现错误以及为什么它会在带有stringForColumn的行中发生,而不是在带有intForColumn的行中发生(正如调试器告诉我的那样)。

非常感谢任何帮助或提示!

func fetchExercise(exerciseId: Int) -> Exercise {
    sharedInstance.database!.open()
    let resultSet: FMResultSet! = sharedInstance.database!.executeQuery("Select * from Exercises where ExerciseId = ?", withArgumentsInArray: [String(exerciseId)])
    let fetchedExercise: Exercise = Exercise()
    if (resultSet != nil) {
        fetchedExercise.exerciseId = Int(resultSet.intForColumn("ExerciseId"))
        fetchedExercise.exerciseCategory = resultSet.stringForColumn("ExerciseCategory")
        fetchedExercise.exerciseTitle = resultSet.stringForColumn("ExerciseTitle")
    }
    sharedInstance.database!.close()
    return fetchedExercise      
}

resultSet如下:

1 个答案:

答案 0 :(得分:0)

您必须致电resultsSet.next()以检索结果。例如:

func fetchExercise(exerciseId: Int) -> Exercise {
    sharedInstance.database!.open()
    defer { sharedInstance.database!.close() }

    let resultSet = try! sharedInstance.database!.executeQuery("Select * from Exercises where ExerciseId = ?", values: [exerciseId])
    let fetchedExercise = Exercise()
    if resultSet.next() {
        fetchedExercise.exerciseId       = resultSet.longForColumn("ExerciseId")
        fetchedExercise.exerciseCategory = resultSet.stringForColumn("ExerciseCategory")
        fetchedExercise.exerciseTitle    = resultSet.stringForColumn("ExerciseTitle")
    }

    return fetchedExercise
}

顺便说一句,我不确定您为什么要将exerciseId转换为查询中的字符串。我个人只是传递Int值,如上所示。