SQLite.swift: сбой приложения из-за принудительного развертывания нулевого значения при активном поиске при нажатии на UITableViewCell

Я добавил UISearchBar к своему ViewController, и в нем также есть UITableView, который "подпитывается" данными из базы данных SQLite с использованием SQLite.Swift.

Поиск работает, все результаты отображаются корректно при поиске. Вызов DetailView нажатием TableViewCell также работает нормально, но когда я нажимаю ячейку во время активного поиска, приложение аварийно завершает работу.

Странная вещь: в симуляторе все работает без сбоев, но не на моем физическом устройстве. Я использую последние бета-версии XCode 9 и XCode 9 и запускаю приложение в iOS 11.3 или 11.4.

Я пробовал несколько вещей, но я просто не могу понять, что вызывает сбой. Я вставляю весь ViewController. Я отметил разделы, где используется код, взятый из добавленных фреймворков/расширений.

Ошибка гласит:

"Поток 1: неустранимая ошибка: неожиданно найдено nil при развертывании необязательного значения."

Это раздел, на который указывает ошибка в SQLite.swift:

func value<A: Value>(_ v: Binding?) -> A {
    return value(v!)
}

Мне интересно, где это значение nil.

Вот мой код: спасибо за подсказки и помощь

EDIT: я отредактировал код, потому что ошибка возникла не в ViewController активного окна, а в DetailViewController, которое должно отображаться после нажатия на TableViewCell. Это строка, в которой возникает ошибка:

Этот код должен найти строку в базе данных, где имя и дата соответствуют заданным переменным, чтобы выбрать имя в этой строке:

let nameOfBank = try! database.scalar(table.filter(tableColumnName == cell?.textLabel?.text && tableColumnDate == cell?.detailTextLabel?.text).select(bankName))

person Aeger    schedule 11.05.2018    source источник
comment
Зачем вам принудительно разворачивать необязательный параметр? Это нужно исправить. Либо удалите ? в параметре, либо правильно обработайте нулевое значение для v.   -  person rmaddy    schedule 12.05.2018
comment
Я сомневаюсь, что это причина сбоя, но вы никогда не обновляете filteredDates при изменении текста поиска. Возможно, вы захотите создать структуру bankInfo, содержащую имя и дату; и заполните банки массивом экземпляров этого. Тогда ваша фильтрация будет проще, имея только один массив для фильтрации для создания filteredBanks, вместо того, чтобы пытаться синхронизировать два массива (filteredBanks и filteredDates).   -  person Graham Perks    schedule 12.05.2018
comment
@rmaddy спасибо, но я просмотрел все опции и принудительные развертывания, которые у меня есть в коде, и я думаю, что не понимаю, где можно посмотреть поближе. Я изменил некоторые из них и проверил некоторые другие способы, но с тем же результатом (сбой). Не подскажете еще, на что смотреть?   -  person Aeger    schedule 12.05.2018
comment
@GrahamPerks спасибо. Вы правы - это не причина сбоя, но я тестировал структуру раньше, и, поскольку я новичок, я не смог заполнить массив как структуру или структуру как массив или как это называется. Поэтому я решил оставить это на будущее, когда я смогу понять а) что это делает и б) когда это вообще :)   -  person Aeger    schedule 12.05.2018
comment
@Aeger Я имею в виду func value<A: Value>(_ v: Binding?) -> A { return value(v!) }, где, как вы сказали, ошибка.   -  person rmaddy    schedule 12.05.2018
comment
@rmaddy о, это код из оболочки SQLite.Swift. Когда я что-то меняю, я теряюсь в ошибках :D Я постараюсь изменить это сегодня вечером. Первые попытки не увенчались успехом. Спасибо за разъяснение.   -  person Aeger    schedule 12.05.2018
comment
Хорошо, мне удалось изолировать источник ошибки. Дело даже не в этом ViewController! Он находится в DetailView и происходит при развертывании отдельных элементов в базе данных SQLite. Теперь мне нужно выяснить, как установить для них правильные query/filter/scalar. Все эти строчки пишутся так: let result = try! database.scalar(history.filter(bankName == segueBankName && dateSave == segueBankDate).select(questionsResult)) Прикол: у меня точно такой же scalar в другом приложении и там работает. Единственное отличие: здесь я расширил фильтр, добавив && Надо проверить   -  person Aeger    schedule 13.05.2018


Ответы (1)


Я отвечаю на свой вопрос после того, как нашел источник ошибки.

Ошибка не возникла в ViewController внутри моего вопроса. Это произошло в viewDidLoad() в DetailViewController, где я получил недостающие данные для отображения в деталях из базы данных SQLite.

Вот решение после исследования и проверки GitHub SQLite.swift:

Чтобы получить значение столбца строки, где вы уже знаете два других значения, вам нужно select binding из двойного filter. И это выглядит так:

let wantedValue = try! database.scalar(history.select(valueLookingFor).filter(knownValue1 == firstKnownValue && knownValue2 == secondKnownValue))

Ни ошибки, ни сбоя больше.

person Aeger    schedule 13.05.2018