rápidamente armar un modelo para usted:
Así que, básicamente, "Persona" es su persona, que tiene una relación "mascotas" - este es un "a muchas "relaciones". Una persona puede tener varias mascotas.
Luego hay una entidad "Pet". Es una entidad abstracta que representa cualquier mascota, gato y perro por igual. Tiene una relación inversa con "mascotas" de "Persona". Por lo tanto, desde cualquier mascota, siempre puede rastrear al propietario correspondiente. Además, cada subclase de "Pet" tendrá algunos atributos comunes, como edad/nombre/peso.
Además, las subclases (entidades que tienen "Pet" como "Entidad principal", como "Perro" y "Gato") pueden tener sus propios atributos además de los atributos de "Mascota", como un "Perro" un "barkSound", y un "Cat" tiene un "meowSound".
Puede, por supuesto, agregar tantas personas en su almacenamiento como desee, esto no tiene nada que ver con el modelo de datos.
Para recuperar la información, simplemente use una solicitud de búsqueda para buscar a todas las personas. Luego búscalos y accede a su propiedad "mascotas" para obtener NSSets para sus mascotas. Puede recorrer esos conjuntos para acceder a la información de las mascotas.
Aquí es un ejemplo de cómo se ha podido ir a todas las personas, entonces todos los animales domésticos:
// 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);
}
}
}
Tenga en cuenta que también puede simplemente buscar a los animales domésticos, sin pasar por sus propietarios:
// 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];
El el código anterior no está probado, y podría incluir errores tipográficos, pero le dará la idea de cómo hacerlo.
En este modelo, ¿importaría si Dog o Cat no tuvieran atributos? – Vikings
No, no importaría. Acabo de agregar atributos para mostrarle que _can_ pueden tener atributos. Sin embargo, si nunca tendrán atributos, simplemente puede agregar una cadena de caracteres o una enumeración a "Pet". Sin embargo, si ellos _pueden tener atributos en el futuro, quédense con las subentidades. – JiaYow
Además, ¿cada entidad necesita una subclase NSManagedObject? – Vikings