core data - guia - ¿Cómo puedo saber el tipo de clase de una entidad abstracta en NSPredicate?
qgis manual (2)
Usando datos básicos, me gustaría obtener algunos datos. Mi modelo usa algunas entidades abstractas, vea la imagen adjunta, donde QuantifiedIngredient es una clase abstracta. Me gustaría buscar entidades de Ingredientes que tengan al menos un RecipeQuantifiedIngredients, pero en el medio está QuantifiedIngredient, que es una clase abstracta.
¿Cómo puedo hacer eso? ¿Cómo puedo probar el tipo real de una clase abstracta dentro de NSPredicate? Alguna idea o sugerencia?
La única pista que encontré fue: ¿Cómo se puede hacer referencia al nombre de la entidad hijo en un predicado para una solicitud de recuperación de la entidad padre?
¿Funcionaría una propiedad personalizada en mi QuantifiedIngredient para saber si es un RecipeQuantifiedIngredient? Por ejemplo isRecipeQuantifiedIngredient?
Muchas gracias por tu ayuda.
Si se requiere una recipe
en RecipeQuantifiedIngredient
, podría intentar hacer una búsqueda, que verifique si hay algún ingredient.recipe
. recipe
. Creo que eso funcionará.
La propiedad personalizada, en tipo de bandera, también funcionará para usted. Solo deberá configurar y desarmar cada vez que agregue o elimine toda la recipeQuantifiedIngredient
.
No quiero tomarme el tiempo para traducir esto en CoreData-speak así que aquí está mi pensamiento en SQL:
SELECT * FROM quantifiedIngredients WHERE recipe <> NULL
o algo así. Esta es esencialmente la sugerencia de Nikita de usar una bandera, excepto que la ''bandera'' es la existencia de una propiedad. No sé cómo reaccionará CoreData cuando se enfrente a los GroceryQuantifiedIngredients
que no tienen la recipe
, creo que KVO arrojará una excepción. Puede ser tan osado como para agregar una categoría:
@interface GroceryQuantifiedIngredients (KVOHack)
-(id)recipe;
@end
@implementation GroceryQuantifiedIngredients (KVOHack)
-(id) recipe { return nil; }
@end
Esto, por supuesto, requeriría que CoreData enumerara todos los ingredientes cuantificados, pero supongo que tendrá que hacerlo de todos modos, y un valor return nil
debería optimizarse en código pequeño. La otra consideración es si esto tendrá un efecto negativo en el resto de tu código; Tendrás que hacer esa llamada.
Otra idea que me viene a la mente cuando termino esto es hacer algo como esto (ahora me estoy volviendo loco con mi pseudocódigo):
SELECT * FROM quantifiedIngredients WHERE [i respondsToSelector:@selector(recipe)];
¿Ves lo que quiero decir? Olvidé si CoreData te permite jugar con algún tipo de cursor cuando trabajas con predicados o fetchedThingamabobbers, si es así, creo que esta es tu mejor opción. De todos modos, es domingo por la tarde, así que las cosas se dejan como ejercicio para el lector.
+1 para una buena pregunta.