2009-05-09 12 views
7

Estoy jugando con Core Data, y estoy seguro de que me falta algo obvio, porque no puedo encontrar un ejemplo que se asemeje a lo que estoy tratando de hacer.¿Cómo hacer consultas de datos básicos a través de una relación?

Digamos que estoy jugando con una base de datos de DVD. Tengo dos entidades Una película (título, año, calificación y relación con el actor) y actor (nombre, sexo, imagen).

Obtener todas las películas es fácil. Es sólo:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Winery" 
inManagedObjectContext:self.managedObjectContext]; 

Conseguir todas las películas con "matar" en el título es fácil, sólo añadir un NSPredicate:

NSPredicate *predicate = [NSPredicate predicateWithFormat: 
@"name LIKE[c] "*\"Kill\"*""]; 

Pero de Datos Básicos parece abstractos los campos de identificación para el administrado objetos ... entonces ¿cómo puedo consultar contra un atributo que es un objeto (o: consulta contra una relación)?

En otras palabras, suponiendo que ya tengo el objeto Actor me preocupa ([Id. De objeto 1 - 'Chuck Norris'] por ejemplo), ¿cuál es el formato Predicado para "Darme todas las películas con [Identificación de objeto 1 - 'Chuck Norris'] "?

Respuesta

6

Suponiendo que hay una relación inversa de uno a muchos entre el Actor y las entidades de Película, puede obtener la entidad para Chuck Norris de la misma manera que obtendría una entidad específica, y luego acceder a la matriz de Película entidades vinculadas a la relación en la entidad Actor.

// Obviously you should do proper error checking here... but for this example 
// we'll assume that everything actually exists in the database and returns 
// exactly what we expect. 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Actor" inManagedObjectContext:self.managedObjectContext]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE[c] 'Chuck Norris'"]; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:entity]; 
[request setPredicate:predicate]; 

// You need to have imported the interface for your actor entity somewhere 
// before here... 
NSError *error = nil; 
YourActorObject *chuck = (YourActorObject*) [[self.managedObjectContext executeFetchRequest:request error:&error] objectAtIndex:0]; 

// Now just get the set as defined on your actor entity... 
NSSet *moviesWithChuck = chuck.movies; 

Como nota, este ejemplo se supone, obviamente, 10.5 utilizando propiedades, pero se puede hacer lo mismo en el 10,4 utilizando métodos de acceso.

5

O puede usar otro predicado:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Actor" inManagedObjectContext:self.managedObjectContext]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@",@"Chuck Norris"] 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:entity]; 
[request setPredicate:predicate]; 

YourActorObject *chuck = [[self.managedObjectContext executeFetchRequest:request error:nil] objectAtIndex:0]; 
[request release]; 

NSSet *moviesWithChuck = chuck.movies; 
Cuestiones relacionadas