2013-03-24 16 views
12

Sto usando RestKit 0.20 per analizzare i dati JSON e salvarli nel database. C'è un'entità mappata SchoolClass, gestita da RestKit e salva bene. Ho un'altra entità chiamata MyClass, che memorizza le classi che ho selezionato. Questo è solo locale sul dispositivo.RestKit iOS non può salvare l'entità locale nel database

ecco il codice creano e salvano l'entità 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"); 
} 

Ecco il codice che inizializza l'archivio dati gestita

// 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]; 

Sembra il salvataggio è successo e nel MyClasseTableViewController I potrebbe leggere le voci MyClass salvate. Tuttavia dopo aver chiuso l'app e riavviare di nuovo. MyClassTableViewController è vuoto, perché i risultati recuperati sono vuoti. Ho aperto il file sqlite usando SQLiteBrowser e la tabella MyClass è vuota. Sembra che le entità MyClass vengano salvate solo nella cache ma non nell'archivio permanente. Devo chiamare alcune API fornite da RestKit per salvarlo? Ho provato a leggere il documento ma non sono riuscito a trovarlo. Per favore aiuto.

+1

stai usando annidati contesti oggetto gestito? Se è così, è necessario salvare il contesto di root per ottenere le modifiche salvate nell'archivio dati. –

+0

Ciao Tom, grazie per l'input. Ho aggiunto del codice alla domanda che mostra come viene creato il negozio. Uso la classe RKManagedObjectStore per farlo e ottengo sempre il managedObjectContext Probabilmente RestKit usa qualcosa di annidato, scaverò più a fondo segui il tuo esempio Grazie – Ray

risposta

24

Grazie per la guida di Tom, ho scoperto che RestKit ha NSManagedObjectContext (RKAdditions), che ha un metodo:

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

Sì, ha logica per gestire contesto oggetto gestito nidificato. Ecco il nuovo codice che funziona, basta un cambio di linea, ma ha preso un sacco di tempo per trovare la giusta chiamata :(

#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"); 
    } 
+0

cool .. grazie per il chiarimento – JAHelia

+0

GRAZIE MOLTO !!!! :(così tanto tempo speso a cercare dappertutto per questo! ! Grazie, grazie !!! – crojassoto

+0

GRAZIE. ha usato il framework per molto tempo, ma lo ha ancora dimenticato. lol –