2012-12-07 11 views
8

używam magicznego rekordu: https://github.com/magicalpanda/MagicalRecordRecord Magical nie oszczędzając

próbuję zapisać rekordy, które dostaję z mojej strony do sqllite bazy danych za pomocą magicznego Rekord i danych Core, ale wciąż otrzymuję błąd:

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

Oto kod:

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

Odpowiedz

7

Problem polega na tym, że nie zapisujesz właściwego kontekstu. Jeśli spojrzysz na źródło, [Service createEntity] tworzy obiekt ManagedObject w kontekście bieżącego wątku. Nie w defaultContext.

Musisz więc zamiast kontekstu [[NSManagedObjectContext defaultContext] saveNestedContexts] zapisać kontekst dla bieżącego wątku (tj. Kontekst, w którym został utworzony obiekt ManagedObject). Więc kod powinien być [[NSManagedObjectContext MR_contextForCurrentThread]

5

Czy próbowałeś stosując metodę saveInBackgroundWithBlock: użytkową?

Jeśli nie, możesz spróbować czegoś takiego jak poniższy kod. Zauważ, że to będzie zapisywać wszystkie obiekty w jednym zamachem w tle, a następnie wykonać blok zakończy się głównym wątku:

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

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

Poza tym, można sprawdzić, czy [[NSManagedObjectContext defaultContext] hasChanges] powraca Tak, aby sprawdzić, czy jest to problem z oszczędnościami lub z samym podmiotem.

0

przesunąć linię

[[NSManagedObjectContext defaultContext] saveNestedContexts]; 

zewnątrz pętli for, pracował dla mnie

1

W moim szybkim projektu zrobić:

MagicalRecord.setupCoreDataStack() 

tak potem Aby zapisać na dysku, należy wykonać następujące czynności:

NSManagedObjectContext.MR_defaultContext().MR_saveToPersistentStoreAndWait() 
Powiązane problemy