2012-12-07 11 views
8

Sto usando Magico: https://github.com/magicalpanda/MagicalRecordmagico Record non risparmiando

Sto cercando di salvare i record che ottengo il dal mio sito web al database SqlLite utilizzando Magico e Core Data, ma io continuo a ricevere l'errore:

MR_saveWithErrorCallback:](0xaaa6bd0) NO CHANGES IN CONTEXT <NSManagedObjectContext (0xaaa6bd0): *** BACKGROUND SAVING (ROOT) ***> on *** BACKGROUND THREAD *** - NOT SAVING 

Ecco il codice:

   for(int i = 0; i < count; i += 1) 
      { 
       // results = array of all services from site 
       NSDictionary * result = [results objectAtIndex: i]; 

       NSNumber * sid = @([[result objectForKey: @"id"] intValue]); 
       NSNumber * parent = @([[result objectForKey: @"parent"] intValue]); 
       Service * service = [Service createEntity]; 

       NSString * image = [NSString stringWithFormat: @"%@", [result objectForKey: @"image"]]; 

       NSString * name = [NSString stringWithFormat: @"%@", [result objectForKey: @"name"]]; 
       NSString * machine_name = [NSString stringWithFormat: @"%@", [result objectForKey: @"machine_name"]]; 


       [service setDate: [NSDate date]]; 
       [service setSid: sid]; 
       [service setName: name]; 

       [service setImage: image]; 
       [service setParent: parent]; 
       [service setMachine_name: machine_name]; 


       [[NSManagedObjectContext defaultContext] saveNestedContexts]; 

risposta

7

Il problema è che non si sta salvando il contesto giusto. Se si guarda la fonte, [Service createEntity] crea ManagedObject nel contesto per il thread corrente. Non in defaultContext.

Quindi quello che devi fare è, invece di [[NSManagedObjectContext defaultContext] saveNestedContexts], salvare il contesto per il thread corrente (cioè il contesto in cui è stato creato ManagedObject). Così il codice dovrebbe essere [[NSManagedObjectContext MR_contextForCurrentThread]

5

hai provato a usare il metodo saveInBackgroundWithBlock: utility?

Se non si potrebbe voler provare qualcosa come il codice qui sotto. Si noti che risparmierete tutti gli oggetti in una sola volta in background e quindi eseguire il blocco di completamento sul thread principale:

[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext){ 
    Service *service = [Service createInContext:localContext]; 

    ... set values ... 
} completion:^{ 
    ... 
}]; 

Oltre a questo, si può vedere se [[NSManagedObjectContext defaultContext] hasChanges] torna YES per verificare se si tratta di un problema con il salvataggio o l'entità stessa.

0

spostare la linea

[[NSManagedObjectContext defaultContext] saveNestedContexts]; 

al di fuori del ciclo for, ha funzionato per me

1

Nel mio progetto rapido che faccio:

MagicalRecord.setupCoreDataStack() 

Allora ho è necessario effettuare le seguenti operazioni per salvare su disco:

NSManagedObjectContext.MR_defaultContext().MR_saveToPersistentStoreAndWait()