2012-02-13 13 views
8

Estoy tratando de escribir un método que intenta recuperar un objeto basado en un predicado utilizando una variable (como parte de un NSXMLParser). El código es el siguiente:Utilizando una variable para Elemento nombre en Core Data Predicate

tengo estas variables definidas en la clase:

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

@property (strong, nonatomic) NSString *model; 
@property (strong, nonatomic) NSString *element; 

Ahora bien, en el método, me juego hasta la solicitud de la siguiente manera:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:self.model inManagedObjectContext:self.managedObjectContext]; 
[request setEntity:entity]; 

Ahora el reto - lo que yo quiero para ser capaz de hacer es:

// DOES NOT WORK 
[request setPredicate:[NSPredicate predicateWithFormat:@"%@ == %@", self.element,string]]; 

B ut que no devuelve ningún resultado. Después de algún rededor, noto que esta hace trabajo:

if ([self.element isEqualToString:@"name"]) { 
    [request setPredicate:[NSPredicate predicateWithFormat:@"name == %@", string]]; 
} 

Esto me dice que mi self.element está ajustada correctamente (? Creo), pero que el predicado no le gusta el lado izquierdo de la expresión siendo una variable.

También probé:

[request setPredicate:[NSPredicate predicateWithFormat:@"%s == %@", [self.element UTF8String],string]]; 

... sólo para ver si tal vez prefiere una cadena. Yo tampoco podría hacer ese trabajo.

¿Es lo que intento incluso posible? He leído todo lo que puedo de la documentación de Core Data y no puedo encontrar ningún código de muestra que lo haga de esta manera, pero tampoco encontré nada que dijera que no fuera posible.

EDIT: y ahora el código de trabajo:

[request setPredicate:[NSPredicate predicateWithFormat:@"%K == %@", self.element,string]]; 

Respuesta

14

Si no lo ha hecho antes, leen el Predicate Programming Guide y se puede encontrar todo lo relacionado con los predicados.

Ahora, si he entendido bien, quiere crear un predicado entre dos cadenas, pero la primera no es una cadena definida, pero puede cambiar.
No los he usado antes, pero creo que puede resolver su problema utilizando un predicado con nombres de propiedad dinámicos.

Aquí partir de la documentación: Nombres

propiedades dinámico
Debido a que las variables de cadena están rodeados por comillas cuando se sustituyen en una cadena de formato usando %@, no se puede utilizar %@ para especificar una nombre de propiedad dinámica, como ilustrado en el siguiente ejemplo.

NSString *attributeName = @"firstName"; 
NSString *attributeValue = @"Adam"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ like %@", attributeName, attributeValue]; 

La cadena de formato de predicado en este caso se evalúa como "firstName" como "Adam".

Si desea especificar un nombre de propiedad dinámico, use %K en la cadena de formato , como se muestra en el siguiente fragmento.

predicate = [NSPredicate predicateWithFormat:@"%K like %@", attributeName, attributeValue]; 

La cadena de formato predicado en este caso se evalúa como primer nombre como "Adán" (tenga en cuenta que no hay entre comillas primerNombre).

Más información se puede encontrar también aquí: Predicate Format String Summary.

+0

Esto es perfecto, gracias. La información específica que hace que mi código funcione es la variable% K que trata el argumento como una clave en lugar de un valor. Ahora funciona =) – valdarin

+0

de nada :) Los datos básicos y los Predicados son tecnologías increíbles y puede hacer todo con ellos ... – matteodv