我为你快速建立了一个模型:
所以,基本上“Person”是你的人,它有一个关系“pets” - 这是一个“一对多”的关系。一个人可以有多个宠物。
然后有一个“Pet”实体。它是一个抽象的实体,代表任何宠物,无论是猫还是狗。它与“Person”的“pets”关系具有反向关系。因此,从任何宠物开始,您始终可以追溯到相应的所有者。此外,“Pet”的每个子类都将具有一些共同的属性,如年龄/名称/重量。
此外,子类(将“Pet”作为“父实体”的实体,如“Dog”和“Cat”)除了拥有“Pet”的属性之外,还可以拥有自己的属性,例如“Dog”具有“barkSound”,而“Cat”具有“meowSound”。
当然,您可以添加尽可能多的人到您的存储中,这与数据模型无关。
要检索信息,只需使用获取请求获取所有人员。然后循环遍历它们并访问它们的“pets”属性以获取宠物的NSSet。您可以循环遍历这些集合以访问宠物的信息。
以下是如何获取所有人员,然后获取所有宠物的示例:
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) {
}
[fetchRequest release];
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);
}
}
}
请注意,你也可以直接获取宠物,而无需通过它们的主人:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Pet" inManagedObjectContext:yourContext];
[fetchRequest setEntity:entity];
[fetchRequest setIncludesSubentities:YES];
NSError *error = nil;
NSArray *fetchedObjects = [yourContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
}
[fetchRequest release];
上面的代码未经测试,可能包含拼写错误,但会让您了解如何实现它。