【问题标题】:iPhone Core Data RelationshipiPhone核心数据关系
【发布时间】:2023-03-05 14:14:01
【问题描述】:

我在创建和理解如何为这种情况创建核心数据模型时遇到问题。

(1) 一个人可以拥有多只宠物(狗或猫的组合)。

(2) 也可以有多个人。

我想通过 Person 实体并提取每个人和每个宠物以及那里的信息。

我不确定是否应该使用关系,或者如何在 Core Data 中设置此模型。我迅速记下了我认为模型外观的选择器。为了简单起见,我制作了这个模型,我的模型不处理猫和狗。

非常感谢任何建议或想法。

【问题讨论】:

    标签: iphone ios xcode core-data


    【解决方案1】:

    我很快为你整理了一个模型:

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

    然后有一个“宠物”实体。它是代表任何宠物、猫和狗的抽象实体。它与“人”的“宠物”有反比关系。因此,从任何宠物,你总能追溯到对应的主人。此外,“宠物”的每个子类都有一些共同的属性,例如年龄/姓名/体重。

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

    您当然可以根据需要将任意数量的人员添加到存储中,这与数据模型无关。

    要检索信息,只需使用获取请求来获取所有人。然后遍历它们并访问它们的“宠物”属性以获取它们的宠物的 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];
    

    上面的代码未经测试,可能包含拼写错误,但会告诉你如何做。

    【讨论】:

    • 在这个模型中,如果 Dog 或 Cat 没有属性,会有影响吗?
    • 不,没关系。我刚刚添加了属性来向您展示它们可以具有属性。但是,如果它们永远不会有属性,您可以将类型字符串或枚举添加到“Pet”。但是,如果它们将来可能具有属性,请坚持使用子实体。
    • 另外,每个实体都需要一个 NSManagedObject 子类吗?
    • 不,但是使用子类要容易得多。您将免费获得自动属性和所有好东西。您可以通过选择所有实体轻松地批量创建它们,转到“编辑器”->“创建 NSManagedObject 子类”。
    • 例如,如果我创建了一堆宠物(猫和狗),我应该将 Person 保存在哪里?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多