iPhone核心数据关系

5
我在创建核心数据模型时遇到了问题,并且不理解如何为此情况创建核心数据模型。
(1)一个人可以有多个宠物(狗或猫的组合)。
(2)也可以有多个人。
我想通过Person实体并提取每个人和他们的每个宠物及其信息。
我不确定是否应该使用关系,或者如何在Core Data中设置此模型。我快速记录了我认为模型的选择器。出于简单起见,我的模型不涉及猫和狗。
非常感谢任何建议或想法。
1个回答

11

我为你快速建立了一个模型:

enter image description here

所以,基本上“Person”是你的人,它有一个关系“pets” - 这是一个“一对多”的关系。一个人可以有多个宠物。

然后有一个“Pet”实体。它是一个抽象的实体,代表任何宠物,无论是猫还是狗。它与“Person”的“pets”关系具有反向关系。因此,从任何宠物开始,您始终可以追溯到相应的所有者。此外,“Pet”的每个子类都将具有一些共同的属性,如年龄/名称/重量。

此外,子类(将“Pet”作为“父实体”的实体,如“Dog”和“Cat”)除了拥有“Pet”的属性之外,还可以拥有自己的属性,例如“Dog”具有“barkSound”,而“Cat”具有“meowSound”。

当然,您可以添加尽可能多的人到您的存储中,这与数据模型无关。

要检索信息,只需使用获取请求获取所有人员。然后循环遍历它们并访问它们的“pets”属性以获取宠物的NSSet。您可以循环遍历这些集合以访问宠物的信息。

以下是如何获取所有人员,然后获取所有宠物的示例:

// 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];

上面的代码未经测试,可能包含拼写错误,但会让您了解如何实现它。


在这个模型中,如果狗或猫没有任何属性,会有影响吗? - Vikings
不过使用子类要容易得多。您将获得自动属性和所有免费好处。您可以通过选择所有实体,转到“编辑器”->“创建NSManagedObject子类”来轻松批量创建它们。 - JiaYow
你能否提供一个关于如何遍历集合的快速示例? - Vikings
谢谢,让我问一下,如果我添加了一个宠物,无论是猫还是狗,那么此时我应该添加一个人吗?或者这个链接是如何建立的? - Vikings
1
例如,如果我创建了一堆宠物(猫和狗),那么我应该把这个人保存在哪里? - Vikings
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接