如何从 RestKit 托管对象存储中删除对象

Posted

技术标签:

【中文标题】如何从 RestKit 托管对象存储中删除对象【英文标题】:How to delete an object from RestKit managed object store 【发布时间】:2013-01-11 16:45:39 【问题描述】:

我正在使用 RestKit 0.2 从我的服务器获取 JSON 文件并将对象映射到我的 CoreData 堆栈(类似于 TwitterCoreData 示例)。

在第一个请求中,我得到以下结果:Artist1, Artist2, Artist3

在第二个请求中,一位艺术家已过时,结果如下所示:Artist1, Artist3

现在Artist2 应该从我的本地存储中删除并消失在我的UITableView 中。但是,我找不到从本地存储中删除 Artist2 的方法。

如何从托管对象存储中删除 RestKit 0.2 中的对象?

这就是我正在做的:

#pragma mark - Data methods
- (void)fetchResults 
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Artists"];
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"ordernr" ascending:YES];
fetchRequest.sortDescriptors = @[descriptor];
NSError *error = nil;

// Setup fetched results
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                                                    managedObjectContext:[RKManagedObjectStore defaultStore].mainQueueManagedObjectContext
                                                                      sectionNameKeyPath:nil
                                                                               cacheName:nil];
[self.fetchedResultsController setDelegate:self];
BOOL fetchSuccessful = [self.fetchedResultsController performFetch:&error];

if(fetchSuccessful)
    data = [self.fetchedResultsController fetchedObjects];
    [_tableView reloadData];
    NSLog(@"Fetched artists: %i", [[self.fetchedResultsController fetchedObjects] count]);



- (void)loadData 
[[RKObjectManager sharedManager] getObjectsAtPath:@"/artists.php" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 


     NSLog(@"Fetched artists: %i", [[mappingResult array] count]);

    for (id object in data) 
        if (NO == [[mappingResult array] containsObject:object])
            NSLog(@"DELETE 1 object...");
            //HOW TO DELETE THE OBJECT HERE??
        
    

    [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:@"ArtistsLastUpdatedAt"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    [self fetchResults];

 failure:^(RKObjectRequestOperation *operation, NSError *error) 
    RKLogError(@"Load failed with error: %@", error);
];

【问题讨论】:

能否添加指向TwitterCoreData 示例的链接? 【参考方案1】:

尝试以下方法:

NSManagedObjectContext *context = object.managedObjectContext;

[context deleteObject:object];

NSError *error;
if (![context save:&error]) 

NSLog(@"delete error");

// Handle the error, update UI etc.


【讨论】:

但应用重启后,该值再次变为默认值。保存时没有报错,但好像保存不正确? 您还应该在 persistenStoreManagedObjectContext 上执行保存,因为对象的 managedObjectContext 是它的子对象。【参考方案2】:

我首先遵循 Alexander 回答的建议,但它只是从当前上下文中删除对象。重新启动应用后,将再次从核心数据中获取对象。

因此,您应该将更改保存到持久存储:

NSManagedObjectContext *context = objectToBeDeleted.managedObjectContext;
[context deleteObject:objectToBeDeleted];
NSError *error;
if (![context saveToPersistentStore:&error]) 
    NSLog(@"delete error %@", [error localizedDescription]);

【讨论】:

以上是关于如何从 RestKit 托管对象存储中删除对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 RestKit 中请求托管对象而不将其写回托管对象上下文?

让 RestKit 离开特定的孤立 CoreData 托管对象

Restkit 删除 coredata 中特定对象的所有对象

RestKit本地删除对象,依然出现在mapping中

在 Restkit 执行映射操作之前删除 Core data 中的现有对象

如何在通过 Core Data 保存我的 RestKit 托管对象之前对其进行修改?