2012-06-14 3 views
9

Используя основные данные, я хотел бы получить некоторые данные. В моей модели используются некоторые абстрактные объекты, см. Прикрепленную картинку, где QuantifiedIngredient - абстрактный класс. Я бы хотел получить объекты Ingredient, у которых есть хотя бы один RecipeQuantifiedIngredients, но в середине это QuantifiedIngredient, который является абстрактным классом.Как узнать тип класса абстрактного объекта в NSPredicate?

Как я могу это сделать, как я могу проверить фактический тип абстрактного класса внутри NSPredicate? Любая идея или предложение?

enter image description here

Единственный ключ я нашел: How can you reference child entity name in a predicate for a fetch request of the parent entity?

бы работать настраиваемое свойство в моем QuantifiedIngredient знать, если это RecipeQuantifiedIngredient? Например isRecipeQuantifiedIngredient?

Большое спасибо за помощь.

ответ

1

Я не хочу, чтобы занять время, чтобы перевести это в CoreData-говорить, так вот моя мысль в SQL:

SELECT * FROM quantifiedIngredients WHERE recipe <> NULL 

или что-то подобное. По сути, это предложение Никиты использовать флаг, за исключением того, что «флаг» - это наличие свойства. Я не знаю, как CoreData будет реагировать, столкнувшись с GroceryQuantifiedIngredients, у которого нет recipe, я думаю, что KVO выдаст исключение. Вы можете быть настолько смелыми, чтобы добавить категорию:

@interface GroceryQuantifiedIngredients (KVOHack) 
-(id)recipe; 
@end 

@implementation GroceryQuantifiedIngredients (KVOHack) 
-(id) recipe { return nil; } 
@end 

Это, конечно, потребует CoreData перечислить все quantifiedIngredients, но я предполагаю, что это придется делать это в любом случае, а а return nil следует оптимизировать в крошечную коду. Другое соображение заключается в том, будет ли это плохо влиять на остальную часть вашего кода; вам придется сделать этот звонок.

Еще одна идея, которая всплывает на ум, когда я закончить это, чтобы сделать что-то вроде этого (я теперь получаю действительно свободно с моей псевдо-код):

SELECT * FROM quantifiedIngredients WHERE [i respondsToSelector:@selector(recipe)]; 

Посмотрите, что я имею в виду? Я забываю, позволяет ли CoreData играть с каким-то курсором при работе с предикатами или fetchedThingamabobbers, если это так, как я думаю, это ваш лучший выбор. Во всяком случае, это воскресенье, так что для читателя останутся вещи.

+1 для хорошего вопроса.

+0

Проблема заключается в том, что SQL использует модель сущности-отношения, где нет отношений наследования или многих-ко-многим. Таким образом, работа на уровне SQL не имеет смысла, поскольку Core Data использует объектную модель (с отношениями наследования и многих-ко-многим).Итак, что вы говорите, это как создание программы на C++ и внесение некоторых изменений в ассемблер (конечно, не очень тяжелый). – Ricardo

+0

Что вы говорите об ответахToSelector - это то, что я ищу, кажется, что что-то вызывает className, но он не работает с SQL-хранилищем, но он работает с другими. Это любопытно. Помимо className или отвечаетToSelector, как насчет кастинга? Я отправил электронное письмо в Apple неделю назад, и они сказали мне, что им нужно исследовать это (это вопрос с оплатой). – Ricardo

+0

У вас нет ответа, но то, что вы сказали, очень интересно. Большое спасибо. – Ricardo

2

Если recipe требуется в RecipeQuantifiedIngredient, вы можете попробовать сделать выборку, которая проверит, если есть ingredient.recipe. Думаю, это сработает.

Обычное свойство, в виде флага, также будет работать для вас. Вам просто нужно установить и отключить его, когда вы добавляете или удаляете все recipeQuantifiedIngredient.

+0

Фактический вопрос, можно ли справиться с наследованием от NSPredicate. Я уже думал о добавлении флага, но с точки зрения моделирования это неприятное решение, хотя это может быть обходным путем. Спасибо, в любом случае. – Ricardo

Смежные вопросы