如何告诉 Xcode 将 CoreData 输出刷新到 Sqlite
How to tell Xcode to flush CoreData output to Sqlite
我在 Xcode 10 中使用 CoreData。CoreData 的后备数据存储是 Sqlite。我正在开发 Swift 应用程序,该应用程序将部署到 iOS;不知道这是否相关。
有没有办法告诉 Xcode(或者我猜是模拟器),在 运行 应用程序之后,将任何输出刷新到磁盘上的 Sqlite 文件? Sqlite 输出似乎只有在 Xcode and/or 模拟器关闭时才会刷新,这有点笨拙。
托管对象上下文应在其数据更改后立即显式保存。这是您应该在代码中做的事情,而不是 Xcode 或模拟器的功能。实现并调用保存相关托管对象上下文的函数。不要等到您的应用终止。
func save() {
do {
try self.managedObjectContext.save()
}
catch {
let nserror = error as NSError
NSLog("Whoops! \(nserror), \(nserror.userInfo)")
}
}
但是,如果您使用父上下文和子上下文,事情就会稍微复杂一些。 Apple's documentation 很好地解释了这一点:
当您在上下文中保存更改时,更改只会提交“一次存储”。如果您保存子上下文,更改将推送到其父上下文。在保存根上下文之前,不会将更改保存到持久存储中。 (根管理对象上下文是其父上下文为 nil 的上下文。)此外,父对象在保存之前不会从子对象中提取更改。如果您想最终提交更改,则必须保存子上下文。
对于 SQLite 存储,持久存储 指的是磁盘上的 SQLite 文件。 (默认情况下,磁盘上有三个 SQLite 文件:主文件、-shm 文件和 -wal 文件)。
我在 Xcode 10 中使用 CoreData。CoreData 的后备数据存储是 Sqlite。我正在开发 Swift 应用程序,该应用程序将部署到 iOS;不知道这是否相关。
有没有办法告诉 Xcode(或者我猜是模拟器),在 运行 应用程序之后,将任何输出刷新到磁盘上的 Sqlite 文件? Sqlite 输出似乎只有在 Xcode and/or 模拟器关闭时才会刷新,这有点笨拙。
托管对象上下文应在其数据更改后立即显式保存。这是您应该在代码中做的事情,而不是 Xcode 或模拟器的功能。实现并调用保存相关托管对象上下文的函数。不要等到您的应用终止。
func save() {
do {
try self.managedObjectContext.save()
}
catch {
let nserror = error as NSError
NSLog("Whoops! \(nserror), \(nserror.userInfo)")
}
}
但是,如果您使用父上下文和子上下文,事情就会稍微复杂一些。 Apple's documentation 很好地解释了这一点:
当您在上下文中保存更改时,更改只会提交“一次存储”。如果您保存子上下文,更改将推送到其父上下文。在保存根上下文之前,不会将更改保存到持久存储中。 (根管理对象上下文是其父上下文为 nil 的上下文。)此外,父对象在保存之前不会从子对象中提取更改。如果您想最终提交更改,则必须保存子上下文。
对于 SQLite 存储,持久存储 指的是磁盘上的 SQLite 文件。 (默认情况下,磁盘上有三个 SQLite 文件:主文件、-shm 文件和 -wal 文件)。