RestKit 0.20 with Core Data:删除对象
Posted
技术标签:
【中文标题】RestKit 0.20 with Core Data:删除对象【英文标题】:RestKit 0.20 with Core Data: deleting objects 【发布时间】:2013-11-05 19:14:20 【问题描述】:我正在使用 RestKit 0.20 将 JSON 请求提取到核心数据中。出于某种原因,我必须删除实体(即 myEntity)中的所有对象。我正在使用这段代码:
NSManagedObjectContext *moc = self.objectManager.managedObjectStore.mainQueueManagedObjectContext;
[moc saveToPersistentStore:nil];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.entity = [NSEntityDescription entityForName:@"myEntity"
inManagedObjectContext:moc];
fetchRequest.includesPropertyValues = NO;
NSArray *entries = [moc executeFetchRequest:fetchRequest error:nil];
for (myEntity *entity in entries)
[moc deleteObject:entity];
[moc saveToPersistentStore:nil];
之后,下一个 RKObjectRequestOperation 输出是“(200 OK / 0 objects)”。但实际上,JSON 文档中大约有 700 个对象。
如果我最后调用[[NSURLCache sharedURLCache] removeAllCachedResponses];
,我得到所有700个对象,但我有2个RestKit错误(133000):E restkit.core_data.cache:RKEntityByAttributeCache.m:227 无法检索托管对象...
谁能帮助我如何以正确的方式做到这一点?
编辑:这就是我创建核心数据堆栈的方式:
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"myDataModelName" withExtension:@"momd"];
NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
self.managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];
[self.managedObjectStore createPersistentStoreCoordinator];
[self.managedObjectStore
addSQLitePersistentStoreAtPath:self.pathToDatabase
fromSeedDatabaseAtPath:nil
withConfiguration:nil
options:@ NSInferMappingModelAutomaticallyOption: @YES,
NSMigratePersistentStoresAutomaticallyOption: @YES
error:nil];
[self.managedObjectStore createManagedObjectContexts];
NSManagedObjectContext *moc = self.managedObjectStore.persistentStoreManagedObjectContext;
self.managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:moc];
managedObjectStore.persistentStoreManagedObjectContext
和managedObjectStore.mainQueueManagedObjectContext
有区别吗?
【问题讨论】:
【参考方案1】:您最好在对象管理器上指定一个获取请求块,并允许 RestKit 处理对象的删除。获取请求块允许 RestKit 在映射过程中找到所有需要删除的对象,同时保持任何内部缓存并最大化数据重用。检查文档here(特别是“获取请求块和删除孤立对象”部分)。
是的,managedObjectStore.persistentStoreManagedObjectContext
和 managedObjectStore.mainQueueManagedObjectContext
之间是有区别的。
服务器返回的标头 Cache-Control: public, max-age=180
告诉 URL 缓存系统不要为不到 3 分钟前发出的任何请求请求新结果。因此,在那段时间里,RestKit 不会真正发送请求,而是会从模型中获取对象。
理想情况下,您应该更改返回的标头。但是,实际上,这应该是自动完成的,因为如果它是针对与先前登录的用户不同的用户,您的请求应该是不同的。
【讨论】:
感谢您的回答。我已经有了获取请求块,它就像一个魅力。但就我而言,我必须在用户注销后立即删除用户特定数据。如果我发送一个不返回数据的请求,RestKit 将删除用户特定的数据。但如果设备与服务器没有连接,这将不起作用。 您是否在 RestKit 中创建了持久存储?如果 URL 缓存系统正在维护缓存(这可能意味着服务器发送的标头错误),则清除缓存是正确的方法。 我通过创建核心数据堆栈更新了我的问题。以下是服务器返回的标头:状态代码:200 OK,Cache-Control:public,max-age=180,Content-Length:331743,Content-Type:application/json; charset=utf-8,日期:星期三,格林威治标准时间 2013 年 11 月 6 日 13:15:37,Etag:W/“318860”,服务器:Microsoft-IIS/7.5,X-AspNet-Version:4.0.30319,X-Powered-作者:ASP.NET。以上是关于RestKit 0.20 with Core Data:删除对象的主要内容,如果未能解决你的问题,请参考以下文章
restkit 版本 0.20 上的 fetchRequest - 没有已知的类方法
RestKit with Core Data - 没有主键的映射