我很快为你整理了一个模型:
所以,基本上“人”是你的人,它有一个关系“宠物”——这是一个“对多”的关系。一个人可以养多只宠物。
然后有一个“宠物”实体。它是代表任何宠物、猫和狗的抽象实体。它与“人”的“宠物”有反比关系。因此,从任何宠物,你总能追溯到对应的主人。此外,“宠物”的每个子类都有一些共同的属性,例如年龄/姓名/体重。
此外,子类(将“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];
上面的代码未经测试,可能包含拼写错误,但会告诉你如何做。