RestKit / Core Data:远程删除的实体不会从 Core Data 中删除

Posted

技术标签:

【中文标题】RestKit / Core Data:远程删除的实体不会从 Core Data 中删除【英文标题】:RestKit / Core Data: Remotely deleted entities get not removed from Core Data 【发布时间】:2012-11-14 21:54:30 【问题描述】:

为什么远程删除的实体没有从 Core Data 和数据存储中删除?在开头设置断点 - (void)deleteCachedObjectsMissingFromResult:(RKObjectMappingResult *)result 在 RKManagedObjectLoader 中显示变量结果不包含任何内容。

我可以通过在 RestKit 委托中实现此功能来解决该问题 - (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects 但在我看来,这是一种不干净的代码。 RestKit / Core Data 应该自己做?!无论如何,以下实现将解决问题:

- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects


NSArray *allReservations = [Reservation findAll];  

for(Reservation *reservationRecord in allReservations) 
    if(![objects containsObject:reservationRecord]) 
        [[[[RKObjectManager sharedManager] objectStore] managedObjectContextForCurrentThread] deleteObject:reservationRecord];
    


在没有 didLoadObjects 帮助的情况下解决该问题的任何想法?添加/更新现有实体可以正常工作。

【问题讨论】:

我卡在了完全相同的点上。很高兴您在这里有一个解决方案,但我想知道为什么方法 -deleteCachedObjectsMissingFromResult 不会删除现在不存在的服务器对象。我看到方法 -fetchRequestForResourcePath 不知何故没有返回适当的 fetchRequest,但我没有做足够的研究来了解 RKObjectMappingProvider 究竟是如何存储/创建资源路径的 fetchRequest。 【参考方案1】:

RestKit 只会删除 NSManagedObjectContext 中的条目。您的方法仅编辑 NSManagedObjectContext 中的对象,但从不将它们保存到 objectStore。确保在添加/编辑/删除完成后将更改保存到 ObjectStore。

- (void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects

    NSArray *allReservations = [Reservation findAll];  

    // Deleting each item in NSManagedObjectContext
    for(Reservation *reservationRecord in allReservations) 
        if(![objects containsObject:reservationRecord]) 
            [[[RKObjectManager sharedManager] objectStore] managedObjectContextForCurrentThread] deleteObject:reservationRecord];
        
    

    // Changes only exist in NSManagedObjectContext, delete them in the ObjectStore
    NSError *error = nil;
    if (![[[RKObjectManager sharedManager] objectStore] managedObjectContextForCurrentThread] save:&error]) 
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);

【讨论】:

以上是关于RestKit / Core Data:远程删除的实体不会从 Core Data 中删除的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 0.20 with Core Data:删除对象

使用 Restkit 在 Core Data 中删除后保存对象使其崩溃

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

带有 Core Data 陡峭学习曲线的 RestKit 0.10.1

RESTkit,Core Data:在将对象传输到 Core Data 之前对其进行处理

与 Core Data 和 RestKit 无关的关系