неожиданно обнаружил nil при распаковке необязательного значения: 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! Если я попытаюсь избавиться от восклицательных и вопросительных знаков, то я получаю сообщение об ошибке в консоли о том, что база данных не может быть открыта.


person emilio    schedule 08.01.2016    source источник
comment
Проверьте это, это может ответить на ваш вопрос: stackoverflow.com/questions/24643522/   -  person Cristik    schedule 09.01.2016


Ответы (1)


Проблема в том, что 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)
person Luca Angeletti    schedule 08.01.2016
comment
Не могли бы вы рассказать мне шаги, чтобы убедиться, что я заполняю эту переменную? Честно говоря, я не уверен на 100%, что это значит. - person emilio; 11.01.2016
comment
@emilio: К сожалению, поскольку у меня нет полного кода, который вы используете, я не могу быть более конкретным. Что я могу вам сказать, так это то, что если вы напишете что-то вроде memberDatabase!.executeQuery(..., а memberDatabase будет nil, вы получите сбой. - person Luca Angeletti; 11.01.2016