Отношения CoreData Lazy Load? - PullRequest
       5

Отношения CoreData Lazy Load?

2 голосов
/ 13 сентября 2010

Когда у меня есть сущность CoreData с именем, скажем, «Книга», которая имеет отношение один к одному с другой сущностью («Закладка»), мне нужно будет вставить как экземпляр «Книги», так и экземпляр«Закладка» в контексте управляемого объекта и ручное назначение отношения?

Если я выполняю следующий код для создания экземпляра экземпляра «Книги» ...

Book *book = [NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:managedObjectContext];

Могу ли я,или я не могу выполнить следующий код для извлечения его закладки без вставки экземпляра 'Bookmark' в тот же контекст управляемого объекта?

book.bookmark;

Будет ли CoreData выделять новый экземпляр«Закладка» для меня?

Прежде чем вы попросите меня попробовать это и убедитесь сами: у меня есть.Я либо делаю что-то не так, либо я имел в виду , чтобы создать экземпляры обоих экземпляров 'Book' и 'Bookmark' и назначить отношения вручную.В моем тестировании отношения «необязательно» не отмечены , но ни к чему не привязаны.После вызова getter 'bookmark' в экземпляре 'book' я получаю 'nil'.

Я хотел бы иметь возможность использовать мой код выше, поскольку это позволит моим объектам контроллера иметь дело сконтекст управляемого объекта, в то время как мои объекты модели могут полностью его игнорировать.Из того, что я читал о CoreData, похоже, это предполагаемая реализация.Пожалуйста, поправьте меня, если я ошибаюсь.

Ответы [ 2 ]

4 голосов
/ 14 сентября 2010

Если объект Book всегда требует отношения Bookmark, то вы можете написать собственный метод получения для свойства bookmark, который будет вставлять объект bookmark при необходимости.

Xcode сгенерирует большую часть метода для вас. В редакторе модели данных удерживайте нажатой клавишу bookmark и выберите Copy Objective-C 2.0 Implementation to the clipboard. Затем настройте что-то вроде этого:

- (NSManagedObject *)bookmark 
{
    id tmpObject;

    [self willAccessValueForKey:@"bookmark"];
    tmpObject = [self primitiveBookmark];
    [self didAccessValueForKey:@"bookmark"];

    if (tmpObject==nil){
        BookmarkMO *newBookmark=[NSEntityDescription entityForName:@"Bookmark" inManagedObjectContext:self.managedObjectContext];
        newBookmark.book=self; //triggers kvo relationship assignment
        tmpObject=newBookmark;
    }
    return tmpObject;
}
2 голосов
/ 13 сентября 2010

По моему опыту, вы должны сначала создать обе сущности и сами создать отношения.

что-то вроде этого должно быть то, что вам нужно:

Bookmark *bookmark = [NSEntityDescription insertNewObjectForEntityForName:@"Bookmark" inManagedObjectContext:managedObjectContext];
[book setBookmark: bookmark];  
...