#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 и задаюсь вопросом, как обычно решается эта, безусловно, распространенная проблема.