2010-03-11 4 views
7

Я новичок в основных данных и стараюсь получить все дочерние объекты разных типов с одним запросом. Скажем, что в качестве родителя есть тип «Животное», а дети - «Кот», «Собака» и «Птица». Я хотел бы получить как кошек, так и собак, но не птиц в одном запросе, возвращаемых как объекты животных. Является ли это возможным?Как использовать NSPredicate для захвата дочерних объектов?

ответ

5

Managed objects have an entity property, так что вы должны быть в состоянии объединить Kevin Sylvestre's solution с a predicate из entity.name != "Bird".

+0

Объект - это метод, а не свойство .. – cocoapriest

+1

Это неформальное свойство, поскольку вы можете использовать KVC для доступа к нему (поскольку есть метод там), в отличие от формального ('@ собственности'). –

+0

Фактически вы не можете использовать этот метод с хранилищем SQLite, потому что свойство 'entity' недоступно, если объекты повреждены. У вас нет большого выбора, кроме как сделать шаг фильтра после печати. –

3

Да, можно:

// Load delegate from application and context from delegate. 
SampleAppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 
NSManagedObjectContext *context = delegate.managedObjectContext; 

// Create new request. 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 

// Create entity description using delegate object context. 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Animal" inManagedObjectContext:context]; 

// Set entity for request. 
[request setEntity:entity]; 
[request setIncludesSubentities:YES]; 

// Load array of documents. 
NSError *error; 
NSArray *animals = [context executeFetchRequest:request error:&error]; 

// Release request. 
[request release]; 

// Access array. 
for (id animal in animals) { } 
+0

спасибо за быстрый ответ. Извините, я забыл упомянуть самое главное: есть еще один ребенок (скажем, «Птица»). Мне нужно, чтобы получить как кошек, так и собак, но НЕ ПТИЦ. Я отредактировал главный вопрос – cocoapriest

0

Хотя это (entity.name != "Bird") может работать, если у вас есть только «Cat», «Dog» и «Bird», это не сработает, если вы позже добавите больше «Животные». Вы также можете использовать entity.name == "Dog" && entity.name == "Cat"

Это случай «... у вас когда-нибудь будет какой-нибудь другой, в вашем случае, животные?»

Удачи =)