Jak automatycznie skonfigurować relację danych podstawowych podczas korzystania z kontekstów zagnieżdżonych
Staram się znaleźć przyzwoite rozwiązanie problemu, który pojawia się podczas używania zagnieżdżonych kontekstów obiektów zarządzanych w danych podstawowych. Weźmy model, który ma dwie wartości: Osoba i Nazwa, gdzie każda Osoba ma relację jeden-do-jednego z Nazwą, a związek osoby z Nazwiskiem nie jest opcjonalny. Wcześniej w osobach-awakeFromInsert
metoda, automatycznie utworzę jednostkę nazwy dla nowej Osoby:
- (void)awakeFromInsert
{
[super awakeFromInsert];
NSManagedObjectContext *context = [self managedObjectContext];
self.name = [NSEntityDescription insertNewObjectForEntityForName:@"Name" inManagedObjectContext:context];
}
Działa to dobrze w pojedynczym, nie zagnieżdżonym kontekście obiektów zarządzanych. Jeśli jednak kontekst ma kontekst nadrzędny, gdy zapisany jest kontekst potomny, w kontekście nadrzędnym tworzony jest nowy obiekt Osoba, oraz-awakeFromInsert
jest ponownie wywoływany w tym nowym obiekcieprzed oryginalne właściwości i relacje Osoby są kopiowane. Dlatego tworzony jest inny obiekt Name, a następnie „rozłączany”, gdy istniejąca relacja nazwy jest kopiowana. Zapisywanie nie powiedzie się, ponieważ walidacja pływającej nazwy jest teraz zerowaperson
związek zawodzi. Ten problem jest opisanytutaj jak również w innych miejscach.
Do tej pory nie udało mi się znaleźć dobrego rozwiązania tego problemu. Leniwe tworzenie relacji w metodzie getter powoduje ten sam problem, ponieważ getter jest wywoływany przez wewnętrzną maszynę Core Data, gdy nowa osoba jest tworzona w kontekście nadrzędnym.
Jedyne, co mogę wymyślić, to zrezygnować z automatycznego generowania relacji i zawsze tworzyć relację jawnie albo w klasie kontrolera, która tworzy Osobę, albo w wygodny sposób (np.+[Person insertNewPersonInManagedObjectContext:]
), który jest wywoływany tylko przez mój kod i jestzawsze metoda użyta do jawnego utworzenia nowego obiektu Person. Być może jest to najlepsze rozwiązanie, ale wolałbym nie być tak surowy, aby zezwalać tylko na użycie jednej metody do tworzenia obiektów zarządzanych, gdy inne metody tworzenia, nad którymi nie mam kontroli i których nie mogę użyć łatwo sprawdzić / wykluczyć, istnieje. Po pierwsze, będzie to oznaczać wiele podklas NSArrayController, aby dostosować sposób tworzenia zarządzanych obiektów.
Czy ktoś, kto napotkał ten problem, zaproponował eleganckie rozwiązanie, które umożliwia jednemu obiektowi NSManagedObject automatyczne utworzenie obiektu relacji po utworzeniu / wstawieniu?