2011-10-27 15 views
5

Estoy construyendo un Core Data NSFetchRequest en el objetivo c. En el modelo de datos hay una entidad principal abstracta (que contiene 4 atributos básicos) y muchas entidades secundarias diferentes que incluyen atributos que no están en el elemento primario. Algunos niños contienen atributos que comparten el mismo nombre y tipos de datos.Un predicado de datos básicos para verificar si las entidades secundarias contienen un atributo o "keypath"?

Estoy aplicando fetchRequest a la entidad padre, de modo que busque todas las instancias de las entidades hijo para ver si existe una "ruta clave".

¿Puedo construir un predicado que solo devuelva entidades secundarias que contengan un atributo en particular?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@ IN self.entityAttributes",attribute.name]; 

Aquí, atributo es una instancia de NSAttributeDescription, y el objetivo es la búsqueda de otras entidades que tienen un atributo de un nombre coincidente dentro de su lista de atributos, pero no estoy seguro de cómo formatear el predicado.

Puedo aclarar más si es necesario. ¡Gracias!

Respuesta

5

¿Existe una razón por la que se está inspeccionando los casos en lugar del modelo? Puede averiguar fácilmente qué tipos de entidades tienen una propiedad determinada

for (NSEntityDescription* entityDescription in [self managedObjectModel]) { 
    if ([[entityDescription propertiesByName] objectForKey:@"someProperty"] != nil) { 
    // objects of this entity support the property you're looking for 
    } 
} 
+0

Necesito consultar las instancias porque el objetivo final es obtener los valores distintivos del atributo de todas las instancias que lo han definido. Estoy usando un bucle similar al que enumeraste aquí para generar de forma procesal la tabla de índice para la solución que Wienke sugirió. –

+0

En realidad, creo que deberías ir con la sugerencia de edsko. Cuando la condición 'si' en su código es verdadera, usted tiene la descripción de la entidad que recogerá todas las instancias que tienen la propiedad que desea.Simplemente ejecuta una búsqueda en la descripción de esa entidad, sin un predicado, y allí está. La belleza de esto es que si solo necesita instancias con valores particulares para esa propiedad, puede agregar un predicado para la búsqueda. (Gracias a los dos: no sabía que pudieras obtener tanta información directamente de la mamá.) – Wienke

+0

Si lo que buscas es rendimiento, entonces tal vez deberías reconsiderar un poco tu modelo de base de datos. Core Data almacenará diferentes entidades en diferentes tablas de la base de datos, por lo que incluso si surge una consulta complicada que funciona en todas las entidades, probablemente no funcionará muy bien. Tal vez sea mejor que agregue la propiedad a la entidad padre en su lugar y simplemente no la use en subentidades que no la necesitan. – edsko

1

Pregunta interesante, digna de algún experimento (a falta de una ayuda mejor).

yo probamos este predicado en un objeto gestionado:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"entity.attributesByName.allKeys CONTAINS %@", @“nameOfAttrSought”]; 

pero me dio este error: “La generación de SQL sin aplicarse para predicado”

¿Qué me sugiere que SQL no está preparado para cavar en NSArrays, que es lo que obtienes al consultar NSEntityDescription para sus nombres de atributos.

Si nadie más puede llegar a un predicado que va a hacer lo que quiere a través de una solicitud de búsqueda directa, sugeriría esta solución:

Definir una entidad Namer que tiene una única cadena attr named y una a- muchas relaciones members. Cree uno de estos para cada atributo posible que puedan tener las entidades secundarias de destino. Luego déle al hijo una relación de muchos a Namer llamada (la inversa de la relación members). Después de la inserción, agregue los "nombres" apropiados a esta relación. entonces se podría hacer un predicado como esto tomará:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@“ANY namers == %@“, namerSought]; 
// ("namerSought" is an instance of Namer.) 
+0

Yo también encontré ese error. No parece gustarle cuando trato de usar atributos que no están definidos en la entidad padre. Además, decidí usar un enfoque casi exactamente como lo que describiste aquí. Definitivamente no es la solución ideal, y espero que alguien conozca un truco que todavía no conocemos. De lo contrario, marcaré esta respuesta en un día más o menos. Gracias. –

Cuestiones relacionadas