代码之家  ›  专栏  ›  技术社区  ›  user5102612

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

  •  0
  • user5102612  · 技术社区  · 9 年前

    我已经将FMDB Sqlite Wrapper集成到了我的iOS应用程序中,我还编写了一些DB函数,到目前为止,这些函数都运行得很好。

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

    任何帮助或提示都将不胜感激!

    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 回复  |  直到 9 年前
        1
  •  0
  •   Rob Md Fahim Faez Abir    9 年前

    你必须打电话 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 值,如上所示。