tutorial que español data iphone objective-c xcode ios core-data

iphone - que - core data tutorial swift 4



Configurar un NSPredicate con múltiples condiciones (3)

Eventualmente pude resolver esto usando una subconsulta:

request.predicate = [NSPredicate predicateWithFormat: @"(photosTookThere.@count !=0) AND SUBQUERY(photosTookThere, $Photo, $Photo.isFavourite==1).@count >0" ];

No estoy seguro de cómo se trataría de "poner en cascada" varias condiciones en un NSPredicate.

Soy bastante nuevo en Core Data y no estoy seguro si esa es la manera correcta de lograr lo que estoy buscando hacer.

Esto es lo que estoy tratando de hacer:

Hay un objeto Photo que tiene una relación whereTook con un objeto Location, que tiene un inverso de photosTookThere.

La Foto a su vez tiene un atributo NSNumber llamado isFavourite.

Me gustaría configurar una NSFetchRequest que primero verifique que photosTookThere exista y, de ser así, compruebe cada objeto de fotografía resultante y devuelva solo los que están configurados como favoritos.

Aquí está el código hasta ahora:

request.entity = [NSEntityDescription entityForName:@"Location" inManagedObjectContext:context]; request.sortDescriptors = [NSArray arrayWithObject[NSSortDescriptorsortDescriptorWithKey:@"locationId" ascending:YES]]; request.predicate = [NSPredicate predicateWithFormat:@"photosTookThere.@count != 0"];

¿Cómo podría poner en cascada la segunda condición en el predicado y devolver los resultados correctos?


Puede usar AND y OR en su predicado de forma muy parecida a como lo haría si estuviera especificando una condición "where" en una instrucción SQL. Para buscar un NULL, que parece que desea al comparar con "whereTook", puede compararlo con nil (whereTook = nil).


Simplemente ponga cada condición entre paréntesis y conéctelos con AND.

[NSPredicate predicateWithFormat:@"(photosTookThere.@count != 0) AND (isFavourite == %@)", [NSNumber numberWithBool:YES]];

También recomendaría cambiar el nombre de su relación "whereTook" a "ubicación", y su "photosTookThere" a simplemente "fotos", eso está más en línea con la convención.