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.persistentStoreManagedObjectContextmanagedObjectStore.mainQueueManagedObjectContext有区别吗?

【问题讨论】:

【参考方案1】:

您最好在对象管理器上指定一个获取请求块,并允许 RestKit 处理对象的删除。获取请求块允许 RestKit 在映射过程中找到所有需要删除的对象,同时保持任何内部缓存并最大化数据重用。检查文档here(特别是“获取请求块和删除孤立对象”部分)。


是的,managedObjectStore.persistentStoreManagedObjectContextmanagedObjectStore.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.10 更新到 0.20

RestKit 0.20 映射问题

restkit 版本 0.20 上的 fetchRequest - 没有已知的类方法

RestKit with Core Data - 没有主键的映射

RestKit 0.20:restkit 对象映射使属性映射加倍

RESTKit 0.20 - 注销和清除授权标头