Волшебная запись не сохраняется

Я использую Magical Record: https://github.com/magicalpanda/MagicalRecord

Я пытаюсь сохранить записи, которые я получаю со своего веб-сайта, в базу данных sqllite, используя Magical Record и Core Data, но я продолжаю получать сообщение об ошибке:

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

Вот код:

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

person Kermit the Frog    schedule 07.12.2012    source источник


Ответы (4)


Проблема в том, что вы не сохраняете правильный контекст. Если вы посмотрите на источник, [Service createEntity] создает ManagedObject в контексте текущего потока. Не в defaultContext.

Итак, вам нужно вместо [[NSManagedObjectContext defaultContext] saveNestedContexts] сохранить контекст для текущего потока (т. е. контекст, в котором был создан ManagedObject). Таким образом, код должен быть [[NSManagedObjectContext MR_contextForCurrentThread]

person Edward Huynh    schedule 17.12.2012

Вы пробовали использовать метод утилиты saveInBackgroundWithBlock:?

Если нет, вы можете попробовать что-то вроде кода ниже. Обратите внимание, что он сохранит все ваши объекты за один раз в фоновом режиме, а затем выполнит блок завершения в основном потоке:

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

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

Кроме этого, вы можете увидеть, возвращает ли [[NSManagedObjectContext defaultContext] hasChanges] YES, чтобы проверить, связана ли проблема с сохранением или самой сущностью.

person shilgapira    schedule 08.12.2012

В моем быстром проекте я делаю:

MagicalRecord.setupCoreDataStack()

Итак, мне нужно сделать следующее, чтобы сохранить на диск:

NSManagedObjectContext.MR_defaultContext().MR_saveToPersistentStoreAndWait()
person Besi    schedule 03.02.2016

переместить линию

[[NSManagedObjectContext defaultContext] saveNestedContexts];

вне цикла for, это сработало для меня

person EnasAZ    schedule 24.02.2013