展开可选值时意外发现 nil:Swift - FMDB - executeQuery
unexpectedly found nil while unwrapping an Optional value: Swift - FMDB - executeQuery
我是 Swift、FMDB 和一般开发的新手,我和我在运行时遇到致命错误:unexpectedly found nil while unwrapping an Optional Value.
错误发生在 executeQuery
行
初步尝试及相关代码:
var rightAnswer:FMResultSet?
var memberDatabase:FMDatabase?
....
override func viewDidLoad() {
let path = NSBundle.mainBundle().pathForResource("1_celebs", ofType: "sqlite3")
memberDatabase = FMDatabase(path: path)
if memberDatabase!.open(){
print("database is ready")//it works if I comment out the stuff in loadquestion()
}
else{
print("error finding database")
}
...
func loadQuestion(){
let querySQL = "SELECT Quote, Answer, answerNumber, Celeb1, Celeb2, Celeb3, img1, img2, img3, feedbackImg, Context FROM celebs WHERE answeredRight = 'no' ORDER BY RANDOM() LIMIT 1"
rightAnswer = memberDatabase!.executeQuery(querySQL, withArgumentsInArray: queryParameters)
rightAnswer!.next()
然后我在 func loadQuestion()
中尝试了这个
let results:FMResultSet? = memberDatabase!.executeQuery(querySQL, withArgumentsInArray: nil)
while(results?.next() == true)
{...}
然后我试了这个:
do{
rightAnswer = try memberDatabase!.executeQuery(querySQL, withArgumentsInArray: queryParameters)
while rightAnswer!.next(){...}
} catch let error as NSError {
print("failed: \(error.localizedDescription)")
}
然后,这个:
do{
let rs = try memberDatabase!.executeQuery(querySQL, values: nil)
while rs.next(){...}
} catch let error as NSError {
print("failed: \(error.localizedDescription)")
}
而且我每次都在 executeQuery
行得到同样的错误!如果我试图摆脱感叹号和问号,那么我会在控制台上收到一条错误消息,指出无法打开数据库。
问题是 memberDatabase
是 nil
。
您应该确保您正在填充该变量。
另一个建议,你应该避免强制解包运算符。它确实绕过编译器检查 nil
(或可能的 nil
)值。
Swift 确实提供了更好的解决方案,例如
条件展开
if let memberDatabase = memberDatabase {
try memberDatabase.executeQuery(querySQL, values: nil)
}
后卫
guard let memberDatabase = memberDatabase else { return }
try memberDatabase.executeQuery(querySQL, values: nil)
我是 Swift、FMDB 和一般开发的新手,我和我在运行时遇到致命错误:unexpectedly found nil while unwrapping an Optional Value.
错误发生在 executeQuery
行
初步尝试及相关代码:
var rightAnswer:FMResultSet?
var memberDatabase:FMDatabase?
....
override func viewDidLoad() {
let path = NSBundle.mainBundle().pathForResource("1_celebs", ofType: "sqlite3")
memberDatabase = FMDatabase(path: path)
if memberDatabase!.open(){
print("database is ready")//it works if I comment out the stuff in loadquestion()
}
else{
print("error finding database")
}
...
func loadQuestion(){
let querySQL = "SELECT Quote, Answer, answerNumber, Celeb1, Celeb2, Celeb3, img1, img2, img3, feedbackImg, Context FROM celebs WHERE answeredRight = 'no' ORDER BY RANDOM() LIMIT 1"
rightAnswer = memberDatabase!.executeQuery(querySQL, withArgumentsInArray: queryParameters)
rightAnswer!.next()
然后我在 func loadQuestion()
let results:FMResultSet? = memberDatabase!.executeQuery(querySQL, withArgumentsInArray: nil)
while(results?.next() == true)
{...}
然后我试了这个:
do{
rightAnswer = try memberDatabase!.executeQuery(querySQL, withArgumentsInArray: queryParameters)
while rightAnswer!.next(){...}
} catch let error as NSError {
print("failed: \(error.localizedDescription)")
}
然后,这个:
do{
let rs = try memberDatabase!.executeQuery(querySQL, values: nil)
while rs.next(){...}
} catch let error as NSError {
print("failed: \(error.localizedDescription)")
}
而且我每次都在 executeQuery
行得到同样的错误!如果我试图摆脱感叹号和问号,那么我会在控制台上收到一条错误消息,指出无法打开数据库。
问题是 memberDatabase
是 nil
。
您应该确保您正在填充该变量。
另一个建议,你应该避免强制解包运算符。它确实绕过编译器检查 nil
(或可能的 nil
)值。
Swift 确实提供了更好的解决方案,例如
条件展开
if let memberDatabase = memberDatabase {
try memberDatabase.executeQuery(querySQL, values: nil)
}
后卫
guard let memberDatabase = memberDatabase else { return }
try memberDatabase.executeQuery(querySQL, values: nil)