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

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

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

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

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

Ошибка говорит:

"Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value."

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

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

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

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

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

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

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

Зачем вам принудительно разворачивать необязательный параметр? Это нужно исправить. Либо удалите ? в параметре, либо правильно обработайте нулевое значение для v.

rmaddy 12.05.2018 00:52

Я сомневаюсь, что это источник сбоя, но вы никогда не обновляете filteredDates при изменении текста поиска. Возможно, вы захотите создать структуру bankInfo, содержащую имя и дату; и заполните bankArray экземплярами этого. Тогда ваша фильтрация будет проще, имея только один массив для фильтрации для создания filterBanks, вместо того, чтобы пытаться поддерживать синхронизацию двух массивов (filterBanks и filterDates).

Graham Perks 12.05.2018 00:59

@rmaddy, спасибо, но я пробежался по всем опциям и принудительным развертываниям, которые есть в коде, и я думаю, что не понимаю, где можно посмотреть. Я изменил некоторые из них и протестировал другие способы, но с тем же результатом (сбой). Не могли бы вы дать мне еще один совет, на что смотреть?

Aeger 12.05.2018 11:20

@GrahamPerks, спасибо. Вы правы - это не причина сбоя, но я тестировал эту структуру раньше, и, поскольку я новичок, я не смог заполнить массив как структуру или структуру как массив или как это называется. Поэтому я решил оставить это на будущее, когда смогу понять а) что это делает и б) когда это вообще есть :)

Aeger 12.05.2018 11:21

@Aeger Я имею в виду func value<A: Value>(_ v: Binding?) -> A { return value(v!) }, в котором вы указали ошибку.

rmaddy 12.05.2018 16:34

@rmaddy ой, это код из оболочки SQLite.Swift. Когда я что-то меняю, я погребен в ошибках: D Я постараюсь исправить это сегодня вечером. Первые попытки не увенчались успехом. Спасибо за разъяснение.

Aeger 12.05.2018 18:14

Хорошо, мне удалось изолировать источник ошибки. Его даже нет в этом ViewController! Он находится в DetailView и возникает при разворачивании отдельных элементов в базе данных SQLite. Теперь мне нужно выяснить, как установить их на правильный query / filter / scalar. Все эти строчки написаны так: let result = try! database.scalar(history.filter(bankName == segueBankName && dateSave == segueBankDate).select(questionsResult)) Забавно: у меня точно такой же scalar есть в другом приложении, и он там работает. Единственное отличие: здесь я расширил фильтр, добавив &&. Необходимо проверить.

Aeger 13.05.2018 00:01
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
320
1

Ответы 1

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

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

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

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

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

Ни ошибок, ни сбоев.

Другие вопросы по теме