2013-02-22 3 views
0

В модели ядра данных существуют три Сущности A, B и C где A может иметь отношение к B и/или C.Получить все дочерние контексты в NSManagedObjectContext

По некоторым причинам B и C создаются в контексте ребенка (они оба разделяют же ребенок контекст) в A сек контексте. Таким образом, существует один родительский контекст (используется A) с один детский контекст (используется B и C).

Теперь мне нужно

  1. получать все A с и
  2. выборки всех B с (или C с).

Я использую MagicalRecord взаимодействовать с CoreData, так (1) довольно легко достичь:

NSArray *all_As = [A findAll]; 

Для достижения (2), теперь я мог использовать, что я знаю A «s контекст :

NSManagedObjectContext *contextOfA = a.managedObjectContext 

, где a является экземпляром A. Обратите внимание, что из-за того, как мое приложение было разработано, всегда есть a, который может быть использован для получения всех B экземпляров C (другими словами: мне не нужно обращаться к B и C без A). Как указано выше, между A и BC) не должно быть связи. В конце концов, a не обязательно должен существовать (b и c могут жить без a).

Но я знаю, что B и C живут в детском контексте A.

Поэтому в основном я просто нужно получить контекст ребенка a.managedObjectContext «s и выполнить запрос выборки на этом детском контексте:

NSArrray *all_Bs = [B findAllInContext: a.managedObjectContext.childContext] 

Но , как я могу получить доступ a.managedObjectContext.childContext?

ответ

0

Разве вы не можете просто называть это?

NSArray *all_Bs = [B findAll]; 

MR должно иметь возможность иметь дело с контекстами отдельно, если они не упомянуты.

Если это не сработает - вы не можете предсказать, будет ли он использоваться сторонними фреймворками - почему бы вам просто не сохранить ссылку на ваш детский контекст и использовать это при извлечении B?

(Почему вы использовали бы что-то наподобие MR вне меня.Это делает вещи немного более сложным, когда вы на самом деле, используя расширенные функции Core Data)

+0

К сожалению, это не возвращает желаемый результат. Я думаю, это из-за того, как я спасаю объекты (см. Пояснения в моем оригинальном посте). Что касается вашего второго предложения, как узнать детальный контекст объекта после перезапуска приложения? Я имею в виду, что в этой ситуации я не могу создать ссылку, потому что я не знаю, что сказать, не так ли? – Patrick

+0

Я изначально не использовал MR, но реализовал его после борьбы с iCloud в сочетании с Core Data. MR упрощает этот материал. Но даже простые задачи, такие как получение всех объектов, намного проще с использованием MR. – Patrick

+0

Я сделал это? Тогда я неправильно понял ваше предложение, сожалею об этом. Я буду отмечать ваш ответ как принятый. – Patrick

0

я нашел способ решить мою проблему:.

В моих AppDelegate, я ставлю переменную NSManagedObjectContext *tempObjectContext;. Когда я добавляю объект A, я добавляю его к этому tempObjectContext.

Как указано на моем оригинальном посте, это a постоянно существует при добавлении нового объекта или C. Но B и C не должны связываться с a. Поэтому я добавляю те B и C объектов в tempObjectContext.

Теперь, когда я хочу, чтобы сохранить B или C объект, я сохранить их в [NSManagedObjectContext defaultContext] и удалить их из tempObjectContext:

B *finalObject = [B createInContext:[NSManagedObjectContext defaultContext]]; 
NSDictionary *attributes = [[B entityDescription] attributesByName]; 
[finalObject setValuesForKeysWithDictionary:[self.temp dictionaryWithValuesForKeys:[attributes allKeys]]]; 

[[NSManagedObjectContext defaultContext] insertObject:finalObject]; 

[self.mainDelegate.tempObjectContext deleteObject:self.temp]; 

Итак, почему я делаю все это? Простой: когда я разместил все A, B и C в один и тот же объект, тогда создайте a, а затем b, я не смог сэкономить b без сохранения a (так как все они сопротивляются в том же контексте). Использование отдельных контекстов решает эту проблему.