iOS RestKit не может сохранить локальный объект в базу данных

Я использую RestKit 0.20 для анализа данных JSON и сохранения в базе данных. Есть сопоставленный объект SchoolClass, который обрабатывается RestKit и отлично сохраняется. У меня есть другой объект под названием MyClass, в котором хранятся выбранные мной классы. Это только локально на устройстве.

Вот код, который я создаю и сохраняю сущность MyClass

 NSManagedObjectContext *managedObjCtx = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext;
 MyClass* course = [managedObjCtx insertNewObjectForEntityForName:@"MyClass"];

 .. set the data for course here

 NSError *executeError = nil;
 if(![managedObjCtx save:&executeError]) {
      NSLog(@"Failed to save to data store");
 }

Вот код, который инициализирует управляемое хранилище данных

  // Initialize managed object store
    NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
    RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];
    objectManager.managedObjectStore = managedObjectStore;

   /**
     Complete Core Data stack initialization
     */
    [managedObjectStore createPersistentStoreCoordinator];
    NSString *storePath = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"RKMainDb.sqlite"];
    NSString *seedPath = [[NSBundle mainBundle] pathForResource:@"RKSeedDatabase" ofType:@"sqlite"];
    NSError *error;
    NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:storePath fromSeedDatabaseAtPath:seedPath withConfiguration:nil options:nil error:&error];
    NSAssert(persistentStore, @"Failed to add persistent store with error: %@", error);

    // Create the managed object contexts
    [managedObjectStore createManagedObjectContexts];

    // Configure a managed object cache to ensure we do not create duplicate objects
    managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext];

Похоже, что сохранение прошло успешно, и в MyClasseTableViewController я смог прочитать сохраненные записи MyClass. Однако после того, как я закрою приложение и снова перезапущу. MyClassTableViewController пуст, потому что полученные результаты пусты. Я открыл файл sqlite с помощью SQLiteBrowser, а таблица MyClass пуста. Похоже, объекты MyClass сохраняются только в кеше, но не в постоянном хранилище. Нужно ли мне вызывать какой-либо API, предоставляемый RestKit, чтобы сохранить его? Я попытался прочитать документ, но не смог найти его. Пожалуйста помоги.


person Ray    schedule 24.03.2013    source источник
comment
Используете ли вы контексты вложенных управляемых объектов? Если это так, вам нужно сохранить корневой контекст, чтобы сохранить изменения в хранилище данных.   -  person Tom Harrington    schedule 25.03.2013
comment
привет Том, спасибо за вклад. Я добавил код к вопросу, который показывает, как создается магазин. Для этого я использую класс RKManagedObjectStore и всегда получаю из него manageObjectContext. Возможно, RestKit использует что-то вложенное. Я буду копать глубже, следуя вашему примеру. Спасибо.   -  person Ray    schedule 25.03.2013


Ответы (1)


Спасибо Тому за руководство, я обнаружил, что в RestKit есть NSManagedObjectContext (RKAdditions), у которого есть метод:

- (BOOL)saveToPersistentStore:(NSError **)error

Да, у него есть логика для обработки вложенного контекста управляемого объекта. Вот новый код, который работает, всего одно изменение строки, но потребовалось много времени, чтобы найти правильный вызов :(

#import "NSManagedObjectContext+RKAdditions.h"
     NSManagedObjectContext *managedObjCtx = [RKManagedObjectStore defaultStore].mainQueueManagedObjectContext;
     MyClass* course = [managedObjCtx insertNewObjectForEntityForName:@"MyClass"];

     .. set the data for course here

     NSError *executeError = nil;
     if(![managedObjCtx saveToPersistentStore:&executeError]) {
          NSLog(@"Failed to save to data store");
     }
person Ray    schedule 25.03.2013
comment
СПАСИБО ОГРОМНОЕ!!!! :( столько времени потратили на поиски этого везде!! Спасибо спасибо!!! - person crojassoto; 28.05.2015
comment
СПАСИБО. уже давно использую фреймворк, но все еще забыл об этом. ржу не могу - person John Paul Manoza; 18.08.2015