извлечение значений основных данных с использованием предиката - PullRequest
0 голосов
/ 11 августа 2011

В моем sqlite есть элементы в одном объекте, и я хочу получить их в соответствии с их ID категории

например. categoryID 1 имеет 7 элементов, а categoryID 2 имеет 5 элементов, когда я нажимаю на IBAction, он приходит к этому методу и получает его в соответствии с моим global.clickedTag

но я не могу получить значения, есть идеи, почему?

-(NSMutableArray*)fetchItem:array{
[self managedObjectContext];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"IItem" inManagedObjectContext:managedObjectContext];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];

    //filter here
    NSPredicate * predicate  = [NSPredicate predicateWithFormat:@"categoryID == %i",myGlobal.clickedTag];
    [request setPredicate:predicate];
    [request setEntity:entity];


    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"ID" ascending:YES];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    [request setSortDescriptors:sortDescriptors];
    [sortDescriptor release];
    NSError *error;

    NSMutableArray* mutableFetchCategory = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

    if (!mutableFetchCategory) {
        // Handle the error.
    }


    if ([mutableFetchCategory count] > 0) 
    {

        for (NSManagedObject *info in mutableFetchCategory)
        {
            if ([[info valueForKey:@"categoryID"]intValue] == myGlobal.clickedTag)
            {
            NSLog(@"ID: %@", [info valueForKey:@"ID"]);
            NSLog(@"category NAME/photo: %@", [info valueForKey:@"name"]);
            NSLog(@"categoryID : %@",[info valueForKey:@"categoryID"]);

            Item * i = [[Item alloc]initWithTitle:[info valueForKey:@"ID"] name:[info valueForKey:@"name"] description:[info valueForKey:@"desc"] thumbnail:[info valueForKey:@"thumbnail"] photo:[info valueForKey:@"photo"] categoryID:[info valueForKey:@"categoryID"]];

            [array addObject:i];
            NSLog(@"array count : %i",[array count]);

            }
        }

    }
    [mutableFetchCategory release];
    [request release];
    return array;

}

1 Ответ

5 голосов
/ 13 августа 2011

У вас много проблем:

Эта строка:

-(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 или нет.

...