Swift: сбой приложения при доступе к значению NULL из SQLite.swift

Я только начал изучать Swift4. Я прочитал все предложения по повторяющимся вопросам о переполнении стека, но не смог решить или понять свою проблему.

Я извлекаю данные из базы данных SQLite.swift:

ViewController.swift:

import Foundation
import SQLite

// Load DB with SQLite.swift
let path = Bundle.main.path(forResource: "myDataBaseFile", ofType: "sqlite")!
let db = try! Connection(path, readonly: true)

// SQLite.swift define table
let table = Table("table")

// SQLite.swift define columns 
let id = Expression<Int>("id")
let medium = Expression<String>("medium")

// Function to get query result
func queryForMedium(idForQuery: Int) -> String? {
    let media = try? db.scalar(table.select(medium).filter(id == idForQuery))
    return media
}

// ViewDidLoad
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    // Value for ID = 2 access a SQL Null value
    anOptionalString = queryForMedium(idForQuery: 2)

    if anOptionalString != nil {
        print("Contains a value!")
    } else {
        print("Doesn’t contain a value.")
    }

}

Результат:

  • ID = 1 содержит "Тест" -> Запуски приложения: Вывод консоли:
    Contains a value!
  • ID = 2 содержит NULL -> CRASH: вывод консоли:
    SQLite was compiled with optimization - stepping may behave oddly; variables may not be available.

Снимок экрана Xcode после сбоя приложения

Примечание. Я попытался отключить уровень оптимизации (Настройки сборки), результат тот же.

Буду признателен за помощь или решения!


person Tyrus Rechs    schedule 15.08.2018    source источник


Ответы (1)


Вам нужно сообщить SQLite.swift, что столбец medium может быть нулевым, используя необязательный общий <String?>

Изменять

let medium = Expression<String>("medium")

to

let medium = Expression<String?>("medium")
person Joakim Danielson    schedule 15.08.2018