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, за да направя това, и винаги получавам managedObjectContext от него. Може би 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