Я быстро собрал для вас модель:

Итак, по сути, «Персона» - это ваша личность, у которой есть отношения «домашние животные» - это отношения «ко многим». Один человек может иметь несколько домашних животных.
Тогда есть сущность "Домашнее животное". Это абстрактная сущность, которая представляет любое животное, кошку и собаку. Он имеет обратную связь с «домашними животными» от «Персона». Поэтому от любого питомца вы всегда можете отследить соответствующего владельца. Кроме того, каждый подкласс "Pet" будет иметь некоторые общие атрибуты, такие как возраст / имя / вес.
Кроме того, подклассы (сущности, которые имеют "Pet" в качестве "Родительской сущности", такие как "Dog" и "Cat") могут иметь свои собственные атрибуты в дополнение к атрибутам "Pet", как "Dog" имеет "barkSound", а у "Cat" есть "meowSound".
Конечно, вы можете добавить в хранилище столько людей, сколько захотите, это никак не связано с моделью данных.
Чтобы получить информацию, просто используйте запрос на выборку, чтобы получить всех людей. Затем переберите их и получите доступ к свойству "домашних животных", чтобы получить NSSets для своих домашних животных. Вы можете просмотреть эти наборы, чтобы получить доступ к информации о домашних животных.
Вот пример того, как выбрать всех людей, а затем всех питомцев:
// Fetch all persons
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:yourContext];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *fetchedObjects = [yourContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
// Handle error case
}
[fetchRequest release];
// Loop through all their pets
for (Person* person in fetchedObjects)
{
NSLog(@"Hello, my name is %@", person.name);
for (Pet* pet in person.pets) {
if ([pet isKindOfClass:[Dog class]])
{
NSLog(@"Woof, I'm %@, owned by %@", pet.name, pet.owner.name);
}
else
{
NSLog(@"Meow, I'm %@, owned by %@", pet.name, pet.owner.name);
}
}
}
Обратите внимание, что вы также можете просто забрать домашних животных, не проходя через их владельцев:
// Fetch all persons
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Pet" inManagedObjectContext:yourContext];
[fetchRequest setEntity:entity];
[fetchRequest setIncludesSubentities:YES]; // State that you want Cats and Dogs, not just Pets.
NSError *error = nil;
NSArray *fetchedObjects = [yourContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
// Handle error case
}
[fetchRequest release];
Приведенный выше код не тестируется и может содержать опечатки, но даст вам представление о том, как это сделать.