我正在尝试使用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);
}
}
答案 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...
}
}
答案 1 :(得分:0)
在RestKit 0.10之前,RKManagedObjectStore保留了每个使用过的实体的缓存副本。但是当从CoreData中删除实体时,该对象保留在缓存中。因此,稍后当您想要重新保存同一个对象时,它不会在CoreData中创建它,而是从其缓存中获取(错误的)对象。 我有完全相同的问题,请参阅CoreData validation error 1550
两种解决方案: