2012-03-09 18 views
5

Tengo problemas para crear y comprender cómo crear un modelo de datos básicos para esta situación.iPhone Core Data Relationship

(1) Una persona puede tener varias mascotas (ya sea una combinación de un perro o un gato).

(2) Puede haber varias personas también.

Quiero ir a través de la entidad Persona y sacar a cada persona, y cada mascota y su información.

No estoy seguro de si debería usar una relación, o cómo puedo configurar este modelo en Core Data. Rápidamente apunté a un selector de lo que pensé que se vería en la modelo. Hice este modelo por simplicidad, mi modelo no trata con gatos y perros.

Cualquier sugerencia o idea es muy apreciada.

enter image description here

Respuesta

11

rápidamente armar un modelo para usted:

enter image description here

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.

+0

En este modelo, ¿importaría si Dog o Cat no tuvieran atributos? – Vikings

+0

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

+0

Además, ¿cada entidad necesita una subclase NSManagedObject? – Vikings