iPhone Core Data Relationship - PullRequest
       2

iPhone Core Data Relationship

5 голосов
/ 09 марта 2012

У меня проблемы с созданием и пониманием того, как создать базовую модель данных для этой ситуации.

(1) У человека может быть несколько домашних животных (в комбинации с собакой или кошкой).

(2) Также может быть несколько человек.

Я хочу пройти через сущность Персона и вытащить каждого человека, каждого питомца и информацию.

Я не уверен, стоит ли мне использовать отношения или как настроить эту модель в Базовых данных. Я быстро набросал подборщик того, что, как я думал, будет выглядеть модель. Я сделал эту модель для простоты, моя модель не работает с кошками и собаками.

Любые предложения или идеи с благодарностью.

enter image description here

1 Ответ

11 голосов
/ 09 марта 2012

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

enter image description here

Итак, по сути, «Персона» - это ваша личность, у которой есть отношения «домашние животные» - это отношения «ко многим». Один человек может иметь несколько домашних животных.

Тогда есть сущность "Домашнее животное". Это абстрактная сущность, которая представляет любое животное, кошку и собаку. Он имеет обратную связь с «домашними животными» от «Персона». Поэтому от любого питомца вы всегда можете отследить соответствующего владельца. Кроме того, каждый подкласс "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];

Приведенный выше код не тестируется и может содержать опечатки, но даст вам представление о том, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...