Многочисленные проблемы NSManagedObjectContext - PullRequest
3 голосов
/ 13 сентября 2011

Я использую вторичный управляемый объектный текст в последовательной очереди GCD, используя тот же постоянный координатор хранилища (и модель).Проблема, которую я имею, состоит в том, что вторичная управляемая модель объекта кажется пустой - все запросы на выборку ничего не возвращают.Я использую магазин sqlite.Я пытался сделать то же самое в главном потоке, но безрезультатно.

Код довольно прост.CoreDataUtility является одноэлементным, а элемент manageObjectContext этого одноэлементного контекста является другим контекстом управляемого объекта.

    NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] init];
    [managedObjectContext setPersistentStoreCoordinator:[CoreDataUtility instance].managedObjectContext.persistentStoreCoordinator];

Запросы на выборку (я пробовал несколько) идентичны, за исключением мамы.

Вторичная мама выглядит отлично в отладчике - свойства, которые вы ожидаете, будут одинаковыми в основной маме, фактически одинаковы.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2011

Проблема оказалась в том, как я загружал модель. У меня нет объяснения, почему это сработало, но это решило проблему. Может быть, кто-то еще может объяснить.

Этот код:

managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];

был заменен на этот код:

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"mymodel" ofType:@"momd"];
NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];   
0 голосов
/ 13 сентября 2011

Если координатор постоянного хранилища, возвращенный из [CoreDataUtility instance].managedObjectContext.persistentStoreCoordinator, верен (вы проверили это?), То, по крайней мере, эта часть должна быть в порядке.

Я использую аналогичный подход в своем собственном приложении, и мой код для создания фонового контекста точно такой же, как и для основного контекста. Я ожидаю, что проблема может быть в другом месте.

Вы пытались получить доступ к объекту в главном контексте, а затем перевести объект в другой контекст, используя:

NSManagedObject *backgroundObject = [backgroundContext existingObjectWithID:object error:&error];

И посмотреть, если объект все еще действителен?

...