ios - 如何告诉 Xcode 将 CoreData 输出刷新到 Sqlite
问题描述
我在 Xcode 10 中使用 CoreData。CoreData 的后备数据存储是 Sqlite。我正在开发一个将部署到 iOS 的 Swift 应用程序;不知道这是否相关。
有没有办法告诉 Xcode(或模拟器,我猜),在运行应用程序后,将任何输出刷新到磁盘上的 Sqlite 文件?Sqlite 输出似乎只有在 Xcode 和/或 Simulator 关闭时才被刷新,这有点笨拙。
解决方案
托管对象上下文应在其数据更改后立即显式保存。这是您应该在代码中执行的操作,而不是 Xcode 或 Simulator 的功能。实现并调用保存相关托管对象上下文的函数。不要等到您的应用程序终止。
func save() {
do {
try self.managedObjectContext.save()
}
catch {
let nserror = error as NSError
NSLog("Whoops! \(nserror), \(nserror.userInfo)")
}
}
但是,如果您使用父上下文和子上下文,事情会稍微复杂一些。 Apple 的文档很好地解释了这一点:
当您在上下文中保存更改时,更改只会“一次存储”提交。如果您保存子上下文,则会将更改推送到其父上下文。在保存根上下文之前,更改不会保存到持久存储中。(根托管对象上下文是其父上下文为 nil 的上下文。)此外,父级在保存之前不会从子级拉取更改。如果要最终提交更改,则必须保存子上下文。
对于 SQLite 存储,它们所指的持久存储是磁盘上的 SQLite 文件。(默认情况下,磁盘上有三个 SQLite 文件:主文件、-shm 文件和 -wal 文件)。
推荐阅读
- javascript - 在这个 javascript 示例中,如何创建一个可以使用不同参数调用的通用函数?
- java - 类型不匹配,预期 util.List[Nothing] 从 java 到 scala
- oracle - 在 Where 子句、脚本中使用变量
- python - 如何计算损坏的csv每行中的字段数
- regex - 如何在scala中匹配包含加号(+)的字符串?
- arrays - 菜鸟需要帮助循环数组
- visual-studio-code - 禁用 Visual Studio Code 中特定文件的语法高亮显示
- postgresql - postgres 用子句创建表
- php - 有一个从 SQL Server 中提取的 PHP 表来呈现表数据。我想将列标题过滤器添加到列以缩小范围
- itext7 - 有没有办法删除 iText 7 中的所有 XMP 元数据?