2012-01-30 73 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禁用內存中緩存