我可以“手动”将项目插入 AFIncrementalStore 的缓存吗?

Posted

技术标签:

【中文标题】我可以“手动”将项目插入 AFIncrementalStore 的缓存吗?【英文标题】:Can I "manually" insert items into an AFIncrementalStore's cache? 【发布时间】:2013-10-30 10:46:04 【问题描述】:

我已经设置AFIncrementalStore 通过网络从 JSON 服务中获取对象,并将其 persistentStore 设置为 SQLite 数据库。这一切都很好。

现在我想要做的是带外添加对象到该 SQLite 数据库(从 AFIncrementalStore 指向的 Web 服务以外的东西),并将这些添加反映在从原始创建的获取结果控制器中托管对象上下文。

我已经创建了一个以原始 MOC 作为其父对象的托管对象上下文,我可以向其中添加对象,并且它们可以被获取的结果控制器看到。但是它们没有保存到 AFIncrementalStore 的 SQLite 数据库中。有趣的是,AFIncrementalStore 看到这些对象,因为它试图将它们保存回 JSON 服务并抱怨不存在正确的端点(我通过覆盖 requestForInsertedObject:insertedObject 来修复这个问题以返回 nil。)

有人知道我是怎么做到的吗?

【问题讨论】:

【参考方案1】:

如果您不想将对象 POST 到服务器,则必须重写方法

requestForInsertedObject:insertedObject
requestForUpdatedObject:updatedObject
requestForDeletedObject:deletedObject

然后,当您调用上下文的 save: 方法时,您的对象必须保存在数据库中。当我离线进行 CRUD 操作时,我使用了类似的逻辑,并且工作正常。

【讨论】:

【参考方案2】:

听起来您已经找到了大部分答案。 AFIncrementalStore 在您的 AFRESTClient 子类中检查来自 requestForInsertedObject: 的零响应。如果该方法返回 nil,AFIS 会为对象创建一个永久 ID,将对象存储在后备存储中,并且不会尝试再次将其发送到服务器。这些都在executeSaveChangesRequest:withContext:error:的第一部分。

您是否总是在父 ManagedObjectContext 上调用 save:?如果不是,那将是它没有将对象存储在 SQLite 中的另一个原因。但它也不应该尝试将对象发布到服务器。

【讨论】:

以上是关于我可以“手动”将项目插入 AFIncrementalStore 的缓存吗?的主要内容,如果未能解决你的问题,请参考以下文章

HSQLDB如何手动插入记录

在 AWS Redshift、sql 工作台中手动将数据插入表中

Grails数据库迁移-将插入值手动更改日志记录到表中的特定列

Spring Data JPA - 手动插入后的密钥冲突

如何在核心数据中手动插入数据

Laravel - 通过 vue.js 组件将用户插入数据库