У меня есть Базовое хранилище данных, которое содержит несколько объектов MediaItem, которые хорошо описывают элементы мультимедиа. У меня также есть NewsItems, которые имеют отношение один ко многим к ряду MediaItems. Пока все хорошо.
Однако у меня также есть PlayerItems и GalleryItems, которые также имеют отношение один-ко-многим к MediaItems. Таким образом, MediaItems совместно используются объектами.
Учитывая, что многие сущности могут иметь отношения один ко многим, как я могу установить взаимные отношения от MediaItem ко всем (1 или более) сущностям, которые имеют к нему отношения, и, кроме того, как я могу реализовать правила удалить MediaItems, когда число этих взаимных связей падает до 0?
Для записи (и в случае, если она пригодится кому-то еще), я решил эту проблему, создав абстрактный класс MediaLinkedEntity
с отношением один-ко-многим к MediaItems
(с именем MediaItems
в MediaLinkedEntity
конец и LinkedEntities
на конец MediaItem
). Затем я создал подкласс этой сущности для NewsItems
и GalleryItems
и реализовал следующий метод -prepareForDeletion
в MediaLinkedEntity
:
- (void)prepareForDeletion {
NSSet *mediaItems = self.MediaItems;
NSSet *linkedEntities;
// step through all media items we link to
for( MediaItem *mediaItem in mediaItems ){
linkedEntities = mediaItem.LinkedEntities;
if( [ linkedEntities count ] == 1 && [ linkedEntities containsObject: self ] ){
// if this MediaLinkedEntity is the only entry in the mediaItem's linked entities list, delete it.
[ mediaItem.managedObjectContext deleteObject: mediaItem ];
}
}
[ super prepareForDeletion ];
}
По сути, следуя ответу Маркуса ниже.