2012-01-30 108 views
2

我试图使用RestKit和核心数据的服务器端DATAS的本地缓存,但我不能设法做保存对象与Restkit核心数据删除后,使其崩溃

我创建一个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

删除和下载/保存是否发生在同一个线程上,然后在删除然后保存顺序? – shawnwall 2012-01-30 13:27:26

+0

我这么认为,事情是按照这个顺序在MainThread上完成的1.获取存储Core数据中的数据的Restkit 2.手动删除数据3.使用Restkit再次获取=>崩溃 – Julien 2012-01-30 13:35:48

+0

并且您在所有的环境中使用相同的managedObjectContext这些? – shawnwall 2012-01-30 13:41:24

回答

1

所以,你正在使用Restkit获取数据,并使用RestKit来存储CoreData莫克内的数据。

我没有看到你实际将更改保存到磁盘的位置。

为什么不使用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

+0

感谢您的回答,这是我尝试的解决方案之一,但它以同样的方式失败...... – Julien 2012-02-13 14:28:08

0

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

两个解决方案:

  • 要么升级到RestKit 0.10(问题被固定为店里的大返工的一部分)
  • 或修补当前的RKManagedObjectStore禁用内存中缓存