如何从 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 中特定对象的所有对象