iOS RestKit no puede guardar entidad local en la base de datos
core-data nsmanagedobjectcontext (1)
Estoy usando RestKit 0.20 para analizar datos JSON y guardarlos en la base de datos. Hay una entidad mapeada SchoolClass, que es manejada por RestKit y guarda bien. Tengo otra entidad llamada MyClass, que almacena las clases que he seleccionado. Este es solo local en el dispositivo.
Aquí está el código que creo y guardo la entidad 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");
}
Aquí está el código que inicializa el almacén de datos administrados
// 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];
Parece que el guardado fue exitoso y en MyClasseTableViewController pude leer las entradas de MyClass guardadas. Sin embargo, después de cerrar la aplicación y reiniciar de nuevo. MyClassTableViewController está vacío, porque los resultados obtenidos están vacíos. Abrí el archivo sqlite usando SQLiteBrowser y la tabla MyClass está vacía. Parece que las entidades MyClass solo se guardan en la memoria caché pero no en la tienda persistente. ¿Debo llamar a alguna API provista por RestKit para guardarla? Traté de leer el documento pero no pude encontrarlo. Por favor ayuda.
Gracias por el liderazgo de Tom, encontré que RestKit tiene NSManagedObjectContext (RKAdditions), que tiene un método:
- (BOOL)saveToPersistentStore:(NSError **)error
Sí, tiene lógica para manejar el contexto de objetos gestionados anidados. Aquí está el nuevo código que funciona, solo un cambio de línea, pero tomó mucho tiempo encontrar la llamada correcta :(
#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");
}