当我的iOS应用程序启动时,我想使用SQLite.swift连接到本地SQLite数据库,然后向用户显示存储在数据库中的项目列表。建立数据库连接可以throw
。如果连接失败,那么我想向用户显示一条很好的错误消息。
在Main.storyboard
中,我的根视图控制器是UINavigationController
。导航控制器的根/顶视图控制器是UIViewController
,其中包含UITableView
以显示数据库中的项目。
我的第一个想法是连接到AppDelegate
的{{1}}中的数据库,并以某种方式在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)
}
//...
}
的{{1}}中的数据库。如果抛出,则将窗口的根视图更改为用户将看到的错误视图。这样,显示项目的表将永远不会尝试显示项目。
我的第三个想法是让AppDelegate
变得更加懒惰并将问题解决。只需创建一个知道SQLite数据库文件路径的数据访问对象。将dao传递给充当application(_:didFinishLaunchingWithOptions:)
数据源的AppDelegate
。当数据源第一次需要来自数据库的信息时,让dao尝试连接(并在必要时迁移数据库模式等)并在那时让它UIViewController
。即使dao已经连接到数据库,UITableView
在访问数据时也可能需要为throw
做好准备。
您可以分享哪些优雅的处理经验?
谢谢!