【发布时间】:2021-01-05 03:33:08
【问题描述】:
我想知道,SQLite.swift 是否有能力检测并通知表数据更改?
(类似于NSFetchedResultsController 提供的,用于检测和通知实体数据更改)
对于GRDB.swift,它提供了观察表数据变化的能力。
private func configureDataSourceContent() {
switch playerOrdering {
case .byName:
playersCancellable = AppDatabase.shared.observePlayersOrderedByName(
onError: { error in fatalError("Unexpected error: \(error)") },
onChange: { [weak self] players in
guard let self = self else { return }
self.updateDataSourceContent(with: players)
})
case .byScore:
playersCancellable = AppDatabase.shared.observePlayersOrderedByScore(
onError: { error in fatalError("Unexpected error: \(error)") },
onChange: { [weak self] players in
guard let self = self else { return }
self.updateDataSourceContent(with: players)
})
}
}
SQLite 本身确实提供低级数据更改通知回调 (https://www.sqlite.org/c3ref/update_hook.html)。
SQLite.swift 是否通过在sqlite3_update_hook 的顶部构建提供开箱即用的功能?如果没有,我们是否可以自定义构建这样的解决方案?
谢谢。
【问题讨论】:
-
GRDB 付出了很多的努力,使 SQLite 观察对应用程序尽可能简单。您可以查看 GRDB 源代码并使用 various hooks exposed by SQLite.swift 来重现相同的行为。我认为你不会找到现成的答案。
-
简而言之,GRDB 使用 1. SQLite 更新、提交和回滚钩子来跟踪已提交的更改, 2. SQLite 授权器以跟踪保存点,因此不会通知回滚的更改, 3. SQLite 授权器,以便了解跟踪请求中涉及哪些表和列, 4. SQLite 授权器,以便发现哪些语句有机会影响跟踪的请求, 5. SQLite WAL 模式,以便有效地获取更新的值在跟踪的请求受到事务影响后,6. SQLite.swift 完全缺乏的健壮并发模型。
-
也许...毕竟你只是在照顾 GRDB ;-)
标签: ios swift sqlite sqlite.swift