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

时间:2012-01-30 12:53:47

标签: iphone ios core-data restkit

我正在尝试使用RestKit和Core Data作为服务器端数据的本地缓存,但我无法做到这一点

我创建了一个NSManagedObject:

@interface JSONShop : NSManagedObject

@property (nonatomic, retain) NSNumber * shopId;
@property (nonatomic, retain) NSNumber * type;

@end
@implementation JSONShop

@synthesize shopId;
@synthesize type ;

@end

它由Restkit自动映射和存储,我可以从数据库中获取它以在TableViewController中显示它。

我的桌子上有一个主键(在我的映射中定义),例如:

shopMap.primaryKeyAttribute = @"shopId" ;  

当我第一次存储我的对象时,一切都很好:))

之后,当我删除上下文中的所有实体时,当Restkit尝试再次映射并再次保存时,我得到了这个错误:

'CoreData could not fulfill a fault for '0x9412ea0 <x-coredata://F8451322-3890-430F-8ABD-B5EEF1DFED2F/JSONShop/p177>'' 

你知道为什么吗?

这是我的删除代码:

- (void) deleteAllObjects: (NSString *) entityDescription  {

    NSLog(@"Deleting %@",entityDescription);

    NSManagedObjectContext * managedObjectContext = [[RKObjectManager sharedManager].objectStore managedObjectContext] ;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityDescription inManagedObjectContext:managedObjectContext];
    NSError * error ;
    [fetchRequest setEntity:entity];

    NSArray *items = [managedObjectContext executeFetchRequest:fetchRequest error:&error];

    for (NSManagedObject *managedObject in items) {
        [managedObjectContext deleteObject:managedObject];
    }
    if (![managedObjectContext save:&error]) {
        NSLog(@"Error deleting %@ - error:%@",entityDescription,error);
    }

}

2 个答案:

答案 0 :(得分:1)

因此,您正在使用Restkit获取数据,并使用RestKit将数据存储在CoreData Moc中。

我看不到您实际将更改保存到磁盘的位置。

为什么不使用RestKit获取对象然后删除它们?即。

- (IBAction)deleteAllButtonClicked:(id)sender {

    NSArray* objects = [JSONShop findAll]; 
    for (JSONShop *object in objects) { 
        [[JSONShop managedObjectContext] deleteObject:object]; 
    } 
    NSError* error = nil; 
    [[JSONShop managedObjectContext] save:&error]; 
    if (nil != error) { 
        // Error checking here... 
    }
}

此示例项目类似:lottadot-restkit-ios-rails3-1-advanced

答案 1 :(得分:0)

在RestKit 0.10之前,RKManagedObjectStore保留了每个使用过的实体的缓存副本。但是当从CoreData中删除实体时,该对象保留在缓存中。因此,稍后当您想要重新保存同一个对象时,它不会在CoreData中创建它,而是从其缓存中获取(错误的)对象。 我有完全相同的问题,请参阅CoreData validation error 1550

两种解决方案:

  • 升级到RestKit 0.10(问题是作为商店更大的返工的一部分而修复)
  • 或修补当前的RKManagedObjectStore以禁用内存中缓存