iOS показывает ошибку при сбое подключения к базе данных SQLite

#ios #swift #sqlite #appdelegate #sqlite.swift

#iOS #swift #sqlite #appdelegate #sqlite.swift

Вопрос:

При запуске моего приложения iOS я хочу подключиться к локальной базе данных SQLite с помощью SQLite.swift, а затем показать пользователю список элементов, которые хранятся в базе данных. Подключение к базе данных может throw . Если подключение не удается, я хочу показать пользователю хорошее сообщение об ошибке.

В Main.storyboard моем контроллере корневого представления является UINavigationController . Контроллер root / top view навигационного контроллера — это a, UIViewController который содержит UITableView для отображения элементов в базе данных.

Моей первой идеей было подключиться к базе данных в AppDelegate ‘s application(_:didFinishLaunchingWithOptions:) и каким-то образом представить UIAlertController поверх UIViewController . Кажется, я не могу получить UIViewController представление UIAlertController . Даже если бы я мог, я начинаю сомневаться в этом подходе, потому что, если элементы не могут быть загружены из базы данных, таблица в любом случае не будет отображаться под предупреждением. Я работал над чем-то вроде этого:

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    do {
        let documentsDirectories = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let documentsDirectory = documentsDirectories.first!
        let dbPath = documentsDirectory.appendingPathComponent("db.sqlite3")
        let db = try Connection("(dbPath)")
        // ...
    }
    catch {
        let navController = window!.rootViewController as! UINavigationController
        let itemsController = navController.topViewController as! ItemsController
        let failureAlert = UIAlertController(
                                 title: "Fatal Error",
                                 message: "Could not connect to the database.",
                                 preferredStyle: .alert)
        itemsController.present(failureAlert, animated: true, completion: nil)
    }

    //...
}
  

Моя вторая идея по-прежнему заключается в подключении к базе данных в AppDelegate ‘s application(_:didFinishLaunchingWithOptions:) . Если это приводит к сбою, измените корневой вид окна на вид ошибки, который увидит пользователь. Таким образом, таблица, в которой отображаются элементы, никогда даже не попытается отобразить элементы.

Моя третья идея — сделать AppDelegate намного ленивее и устранить проблему в дальнейшем. Просто создайте объект доступа к данным, который знает путь к файлу базы данных SQLite. Передайте dao в UIViewController , который действует как источник данных для UITableView . Когда источнику данных потребуется информация из базы данных в первый раз, попросите dao попытаться подключиться (и при необходимости перенести схему базы данных и т.д.) И разрешить это throw в этот момент. UITableView Вероятно, необходимо быть готовым к throw при доступе к данным, даже если dao уже подключился к базе данных.

Любым опытом, которым вы можете поделиться, чтобы справиться с этим изящно?

Спасибо!

Комментарии:

1. укажите описание вашей ошибки, которое появляется при подключении к базе данных.

2. Поделитесь, пожалуйста, частью вашего кода

3. @KKRocks Я думаю, что вероятность сбоя подключения к базе данных очень мала. Если подключение к базе данных не удается, приложение практически бесполезно. Показывать пользователю что-то вроде «Фатальная ошибка: не удалось подключиться к базе данных». было бы уместно.

4. поделитесь каким-нибудь кодом для подключения к вашей базе данных?

5. @Jecky Я добавил код для первого варианта. Второй и третий варианты — это просто общие идеи подхода, которые могут даже ничего не стоить. Я новичок в программировании на iOS и задаюсь вопросом, как обычно решается эта, безусловно, распространенная проблема.