core data - query - ¿Cómo puedo usar NSPredicate para filtrar las relaciones de datos centrales?
query core data swift 4 (2)
Supongamos que tengo objetos de datos centrales de tipo "obj" que tienen una propiedad "propertyA" y una relación de uno a muchos con un objeto de tipo "sub" que tiene dos propiedades, "propiedadB" y "propiedadC".
Quiero buscar todos los objs que tienen propertyA igual a un valor y un sub obj con propertyB y propertyC.
Si solo fuera propertyA y propertyB, lo haría
[NSPredicate predicateWithFormat:@"ANY sub.propertyB = %@ AND propertyA == %@", ...];
El problema es que no puedo descifrar cómo agregar la segunda propiedad. Solo quiero los objs que tengan al menos un sub que tenga las dos propiedades verdaderas. He intentado lo siguiente, pero no funciona:
[NSPredicate predicateWithFormat:@"ANY (sub.propertyB = %@ AND sub.propertyC) AND propertyA == %@", ...];
Lo intenté sin CUALQUIER pero eso tampoco funciona. ¿Cómo puedo hacer esto?
Como tiene una relación de muchos con el objeto secundario, la propiedad subs
de obj
devuelve un conjunto en lugar de un único objeto. Para consultar el conjunto, debe usar SUBQUERY.
Las subconsultas tienen la forma:
SUBQUERY(collection, $individualCollectionItem, expression-with-collection-item)
en este caso, querrías algo como
SUBQUERY(subs,$s,$s.propertyB==%@) AND SUBQUERY(subs,$s,$s.propertyC!=NULL)
La solución parece ser:
[NSPredicate predicateWithFormat:@"propertyA == %@ AND (SUBQUERY(sub, $s, $s.propertyB == %@ AND $s.propertyC == %@).@count != 0)", propertyAvalue, propertyBvalue, propertyCvalue];
donde los valores al final son los valores que quiere que las diferentes propiedades sean iguales.