Установить отношения с Core Data - PullRequest
0 голосов
/ 12 сентября 2009

У меня есть две сущности, которые связаны через отношение один ко многим, скажем, CategoryEntity и ItemEntity . Отношение является необязательным для CategoryEntity (могут быть категории без элементов), но требуется для каждого ItemEntity. При загрузке приложения Категории уже существуют в магазине, и я хочу импортировать ItemEntities и подключить их к соответствующему CategoryEntity.

Очевидно, что выполнение FetchRequest для каждого ItemEntity для поиска соответствующей категории не будет хорошим решением, поскольку каждый раз будет около 4000-6000 элементов ..

Итак, могу ли я сделать что-нибудь более эффективное?

Ответы [ 2 ]

2 голосов
/ 12 сентября 2009

Если вы правильно настроили модель базовых данных, то у вас есть отношение ко многим от сущности «Категория» к сущности «Элемент» и обратное отношение «один к одному» от «Элемент к категории». Кроме того, у вас есть «каскадное» правило удаления для отношения «многие» и «нулевое» правило удаления для отношения «один».

Исходя из этого, каждый раз, когда вы вставляете объект Item, установка его отношения между категориями автоматически вставляет этот элемент в соответствующую категорию. Удаление элемента автоматически удаляет его из соответствующей категории.

На стороне категории при удалении категории автоматически удаляются все соответствующие объекты элементов.

Поэтому, когда вы выбираете Предметы, вы уже выбрали для каждого объекта Предмета соответствующий ему объект Категории. Вам не нужно больше ничего делать. Обратите внимание, что по умолчанию вы фактически не извлекаете объект Category во время извлечения: вместо этого выдается ошибка при первой попытке доступа к объекту, и объект извлекается в это время. Это обеспечивает лучшую производительность, если вы не планируете немедленно использовать объект Category, сохраненный в только что выбранном объекте Item. Если вы планируете использовать объект Category почти каждый раз, когда получаете элемент, тогда вы должны использовать методы NSFetchRequest

- (void)setReturnsObjectsAsFaults:(BOOL)yesNo
- (void)setRelationshipKeyPathsForPrefetching:(NSArray *)keys

, чтобы сообщить Core Data, что вам теперь нужны ошибки и что вы запрашиваете предварительную выборку вашей категории.

0 голосов
/ 02 октября 2011

Когда вы говорите «импортировать» объекты, что вы имеете в виду? Находятся ли они в другом хранилище базовых данных, определенном в другом формате в каком-либо файле, по сети?

Один из подходов состоит в том, чтобы выбрать все категории за один раз и добавить их в NSDictionary, выступающий в качестве кеша, с ключом некоторого идентифицирующего значения, которое позволяет выполнить быстрый поиск. Для каждого объекта элемента, который вы создаете при импорте (что бы это ни значило), извлекайте его идентификатор категории, а затем извлекайте MO категории из кэша. Установите отношения и затем сохраните. Более того, пакетируйте несколько вставок и сохраняйте их каждые 10, 100 или 1000, чтобы уменьшить накладные расходы ввода-вывода.

...