Core data 无法使用MagicalRecord删除源于RestKit的NSManagedObject
我的用例非常简单。我需要Core data 无法使用MagicalRecord删除源于RestKit的NSManagedObject,core-data,save,restkit,magicalrecord,Core Data,Save,Restkit,Magicalrecord,我的用例非常简单。我需要 创建请求NSManagedObject,✓ 工作 将其传递给例如Restkit中的postObject:method,✓ 工作 在完成块中接收响应NSManagedObject,✓ 工作 处理它,,✓ 工作 使用MR_deleteEntity删除请求和响应对象,✘ 不起作用 我只想使用MagicalRecord创建/删除/管理实体 问题: 当我从MagicalRecord工具箱调用异步保存方法时,在退出应用程序后,我仍然可以看到sqlite db文件中的实体。重新启
- 创建请求NSManagedObject,✓ 工作
- 将其传递给例如Restkit中的postObject:method,✓ 工作
- 在完成块中接收响应NSManagedObject,✓ 工作
- 处理它,,✓ 工作
- 使用MR_deleteEntity删除请求和响应对象,✘ 不起作用
// 1. Setup the core data stack with the automigration
[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:[GVUserDefaults standardUserDefaults].applicationStoreName];
// 2. Initialize managed object store
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithPersistentStoreCoordinator:[NSPersistentStoreCoordinator MR_defaultStoreCoordinator]];
// 3. create the persistentStoreManagedObjectContext and the mainQueueManagedObjectContext:
[managedObjectStore createManagedObjectContexts];
// 4. set the default and the root saving context:
[NSManagedObjectContext MR_defaultStoreCoordinator:managedObjectStore.mainQueueManagedObjectContext];
[NSManagedObjectContext MR_setRootSavingContext:managedObjectStore.persistentStoreManagedObjectContext];
// 5. create RestKit manager:
self.rkManager = [TSNRKObjectManager managerWithBaseURL:[NSURL URLWithString:[self serverURL]]];
self.rkManager.requestSerializationMIMEType = RKMIMETypeJSON;
self.rkManager.managedObjectStore = managedObjectStore;
问题
我正试图通过以下方式删除请求和响应对象:
[self saveWithBlock:^(NSManagedObjectContext *localContext) { // calls [MagicalRecord saveWithBlock:block completion:completion]
// some additional processing, getting data from the response
[loginResponse MR_deleteEntity];
[loginRequest MR_deleteEntity];
} completion:^(BOOL success, NSError *error) {
// some additional processing
}];
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
[[self.loginRequest MR_inContext:localContext] MR_deleteEntity];
[[self.loginResponse MR_inContext:localContext] MR_deleteEntity];
} completion:^(BOOL success, NSError *error) {
if(success) {
self.loginRequest = nil;
self.loginResponse = nil;
// log, update ui
} else {
// log error
}
}];
但我总是在日志中看到这样的信息:
-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x110906470) NO CHANGES IN ** UNNAMED ** CONTEXT - NOT SAVING
我用这一页作为参考。创建请求和响应实体的上下文是否相同?Restkit用于创建实体的上下文是什么?我是否也应该在[MagicalRecord saveWithBlock:block completion:completion]中的块内创建请求实体?中的示例不包括自动迁移设置和异步保存方法
更新:
这是一个可以接受的解决方案吗?(我的意思是干净、优雅的删除):
我已经测试了这个,它是有效的
更新2
在从Restkit的postObject触发的完成块中:。。。调用时,我可以通过以下方式清理持久存储中的实体:
[self saveWithBlock:^(NSManagedObjectContext *localContext) { // calls [MagicalRecord saveWithBlock:block completion:completion]
// some additional processing, getting data from the response
[loginResponse MR_deleteEntity];
[loginRequest MR_deleteEntity];
} completion:^(BOOL success, NSError *error) {
// some additional processing
}];
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
[[self.loginRequest MR_inContext:localContext] MR_deleteEntity];
[[self.loginResponse MR_inContext:localContext] MR_deleteEntity];
} completion:^(BOOL success, NSError *error) {
if(success) {
self.loginRequest = nil;
self.loginResponse = nil;
// log, update ui
} else {
// log error
}
}];
您误解了多个上下文的保存语义。调用
saveWithBlock:
时,需要将所有托管对象传输到为您创建的新本地上下文中,然后再对其进行操作,否则上下文不会发生更改,也不会保存。要进行传输,您需要获取托管对象ID,并找到现有ObjectWithID:error:
在这种情况下,对于2对象删除a,最好直接从主上下文(它们所属的上下文)中删除对象,并将其保存到持久性存储。Hi Wain,感谢您提供的指针。这是一个可以接受的解决方案吗?(我的意思是干净、优雅的删除):请看更新。没关系。您不应该保存两次,两次删除后只保存一次更好(小批量保存,并且两个对象都在同一上下文中)。我不明白的是,与我要删除的实体相关的保存上下文不是我之前设置的rootsavingcontext(后台操作)或defaultContext(ui更新)中的保存上下文(setDefaultContext,setRootSavingContext)。它是主上下文,因为您在主线程上获得了完成回调,并且RestKit将它发送给您的托管对象切换到适当的上下文。谢谢您,Wain。在阅读本文之后,我更新了代码,这也帮助我理解了这个问题。