Сохранить объект после удаления в Core Data с помощью Restkit, чтобы он вылетел - PullRequest
2 голосов
/ 30 января 2012

Я пытаюсь использовать 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 ]

1 голос
/ 03 февраля 2012

Таким образом, вы используете 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

0 голосов
/ 15 мая 2012

До RestKit 0.10 RKManagedObjectStore хранил кэшированную копию каждого используемого объекта.Но когда объект был удален из CoreData, объект был сохранен в кэше.Поэтому позже, когда вы захотите повторно сохранить тот же объект, а не создавать его в CoreData, он выбрал (неисправный) объект из своего кэша.У меня была точно такая же проблема, см. Ошибка проверки CoreData 1550

Два решения:

  • Либо обновление до RestKit 0.10 (проблема исправлена ​​как часть более крупнойпеределка магазина)
  • Или исправьте свой текущий RKManagedObjectStore, чтобы отключить кэширование в памяти
...