无法使用MagicalRecord删除源自RestKit的NSManagedObject

时间:2014-04-13 21:44:39

标签: core-data save restkit magicalrecord

我的用例非常简单。我需要

  • 创建请求 NSManagedObject,✓工作
  • 将其传递给例如来自Restkit的 postObject:方法,✓工作
  • 在完成块中收到响应 NSManagedObject,✓工作
  • 处理它,✓工作
  • 使用MR_deleteEntity删除请求和响应对象,✘不起作用

我想使用MagicalRecord创建/删除/管理实体。

问题:

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

我使用以下设置将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
}];

但我总是在日志中收到此消息:

-[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x110906470) NO CHANGES IN ** UNNAMED ** CONTEXT - NOT SAVING

我使用此页面作为参考https://gist.github.com/tonyarnold/4694673。创建请求和响应实体的上下文是一样的吗? Restkit用于创建实体的上下文是什么?我是否也应该在[MagicalRecord saveWithBlock:block completion:completion]中的块内创建请求实体? https://github.com/blakewatters/RKMagicalRecord中的示例不包括自动迁移设置和异步保存方法。

更新

这是一个可以接受的解决方案吗? (我的意思是干净,优雅的删除):

        [self.loginRequest MR_deleteEntity];
        [self.loginRequest.managedObjectContext MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) {
            // log
        }];



        [self.loginResponse MR_deleteEntity];
        [self.loginResponse.managedObjectContext MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) {
            // log
        }];

我测试了这个并且它有效。

更新2

在Restkit的 postObject: ...调用触发的完成块中,我可以通过这种方式清除持久存储中的实体:

    [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
        }

    }];

1 个答案:

答案 0 :(得分:0)

您误解了多个上下文的保存语义。当您调用saveWithBlock:时,您需要将所有托管对象传输到在操作它们之前为您创建的新本地上下文,否则上下文没有更改,也不会保存。要转移,您需要获取托管对象ID并找到existingObjectWithID:error:

在这种情况下,对于2个对象删除,最好直接从主上下文(它们属于它们)中删除对象,并将其保存到持久存储中。