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删除请求和响应对象,✘ 不起作用
我只想使用MagicalRecord创建/删除/管理实体

问题:

当我从MagicalRecord工具箱调用异步保存方法时,在退出应用程序后,我仍然可以看到sqlite db文件中的实体。重新启动应用程序后,在db中添加新对象,而不删除单个实例,尽管我显式地调用了对象上的MR_deleteEntity。我承认上下文管理是我还没有完全掌握的东西

我正在使用以下设置将MagicalRecord与Restkit连接:

// 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。在阅读本文之后,我更新了代码,这也帮助我理解了这个问题。