Core Data 没有第一次保存

Posted

技术标签:

【中文标题】Core Data 没有第一次保存【英文标题】:Core Data doesn't save the first time 【发布时间】:2014-04-25 13:11:48 【问题描述】:

我在保存 RestKit 0.22 和 Core Data 时遇到问题。为了确保我的项目的其余部分不会导致问题,我在 RestKit 示例中使用 RKTwitterCoreData 重现它。我只是删除了播种部分以从一个空的 sqlite 数据库开始。我的应用基于相同的概念。

我的问题发生在我第一次运行应用程序时。该应用程序从 twitter 接收数据并显示它。但是如果我查看 sqlite 数据库本身,它是空的。当我第二次启动应用程序时,数据库正在填充。

RestKit 是否可以在收到数据的那一刻保存数据?

RestKit 是否可以在保存之前缓存所有数据。我虽然我的问题发生了,因为 RKManagedObjectStore 中的 managedObjectCache 设置为 RKInMemoryManagedObjectCache 但我也尝试了 RKFetchRequestManagedObjectCache 并且得到了相同的结果。

我还尝试使用 [[[RKManagedObjectStore defaultStore] persistentStoreManagedObjectContext] save:nil] 手动保存在成功区域中,但没有成功。

谢谢

【问题讨论】:

当应用程序仍在 Xcode 运行时,您是否正在查看 sqlite 数据库?如果是这样,根据经验,您需要在查看数据之前停止应用运行。 我在运行时和停止应用程序后都尝试了。 您正在查看哪个 sqlite 文件以及如何查看(不是您应该直接查看任何文件...) 【参考方案1】:

RestKit 会在调用成功完成块之前自动保存映射结果。

如果您想检查存储中的内容,请询问 MOC(主线程或持久存储 MOC)并检查 registeredObjects / 运行获取请求。

您不应该查看 SQLite 文件。表结构是一个私有的实现细节,如果您在命令行中使用错误的选项加载文件,您不一定会看到您所期望的。

【讨论】:

我们使用 Core Data Editor(可在 App Store 中获得)查看数据存储。 如果我在成功后获取数据 bloc 我得到了所有数据。但是数据库是空的。为了访问数据库,我在模拟器中运行它并在 app 文件夹中查找 sqlite 文件,或者我使用软件来访问设备内容。我用 MesaSQLite 打开 sqlite 文件。第一次运行应用程序时,数据库总是空的。 因此,在您运行应用程序的几秒钟内,在执行任何其他操作之前,您会运行一次 fetch - 它返回什么? 第二次如果我在设置 managedObjectStore 之后获取数据,我得到了所有数据并且我的数据库已满。在调用 Web 服务之前完成的一切。使用 RKTwitterCoreData,在我第二次运行该应用程序时,数据库在 NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:storePath fromSeedDatabaseAtPath:nil withConfiguration:nil options:nil error:&error] 这一行之后填充。 所以你没有问题,但是你在应用程序之外加载 SQLite 文件是错误的(因此你会看到一个空商店)

以上是关于Core Data 没有第一次保存的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 的 Save 方法第一次调用“nil” - 为啥?

Core Data 不保存对象而且速度很慢

将可转换的 NSAttributedString 保存到 Core Data 时出现异常奇怪的崩溃

应用重新启动时数据不会在 Core Data 中持久化

我应该多久保存到 Core Data?

在 Core Data (IOS) 中保存数据时出错