首页 > 解决方案 > 如何告诉 Xcode 将 CoreData 输出刷新到 Sqlite

问题描述

我在 Xcode 10 中使用 CoreData。CoreData 的后备数据存储是 Sqlite。我正在开发一个将部署到 iOS 的 Swift 应用程序;不知道这是否相关。

有没有办法告诉 Xcode(或模拟器,我猜),在运行应用程序后,将任何输出刷新到磁盘上的 Sqlite 文件?Sqlite 输出似乎只有在 Xcode 和/或 Simulator 关闭时才被刷新,这有点笨拙。

标签: iosxcodesqlitecore-dataios-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 文件)。


推荐阅读