У вас много проблем:
Эта строка:
-(NSMutableArray*)fetchItem:array{
... не является правильным определением метода.Он должен выглядеть следующим образом:
-(NSMutableArray*)fetchItem:(NSMutableArray *) array{
Следующая строка:
[self managedObjectContext];
... ничего не делает, кроме вызова метода доступа, но тогда возвращение игнорируется.Компилятор будет жаловаться на это, и вы не должны игнорировать это.
Ваша главная проблема здесь:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"IItem" inManagedObjectContext:managedObjectContext];
... потому что вы не используете self.managedObjectContext
или [self managedObjectContext]
для доступа к контексту.Это делает вероятным, что вы получите нулевой контекст или тот, который вам не нужен.Вы делаете ту же ошибку здесь:
NSMutableArray* mutableFetchCategory = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
Кстати, вам не нужен изменяемый массив здесь, и вы не хотите копировать его.В итоге вы получите дублированные управляемые объекты, которые вызовут всевозможные проблемы.Где-то был справочный материал, в котором использовалась эта форма, но с тех пор она была исправлена.
Весь блок, который начинается с:
if ([mutableFetchCategory count] > 0)
, не имеет смысла.Это просто создает дальнейшее дублирование уже скопированного массива.
Вы делаете это намного сложнее, чем нужно.Просто воспользуйтесь фрагментом «Core Data Fetch With Predicate» в Xcode4 и заполните пробелы.
-(NSArray *) fetchIItemsWithCategoryID:(NSNumber *) catID{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"IItem"
inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"categoryID==%@",
catID];
[fetchRequest setPredicate:predicate];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"ID" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
NSError *error = nil;
NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
//... error handling code
}
[fetchRequest release];
return fetchedObjects; //fetchedObjects will always exist although it may be empty
}
fetchedObjects
будет массивом объектов NSManagedObject или IItem
, в зависимости от того, предоставили ли выпользовательский подкласс NSManagedObject или нет.