使用谓词获取核心数据值

Ste*_*abs 0 sqlite xcode core-data nspredicate nsfetchrequest

我的sqlite在其中一个实体中有项目,我希望根据它们的categoryID检索它们

例如,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;
Run Code Online (Sandbox Code Playgroud)

}

Tec*_*Zen 5

你有很多问题:

这一行:

-(NSMutableArray*)fetchItem:array{
Run Code Online (Sandbox Code Playgroud)

......不是一个正确的方法定义.它应该看起来像:

-(NSMutableArray*)fetchItem:(NSMutableArray *) array{
Run Code Online (Sandbox Code Playgroud)

下一行:

[self managedObjectContext];
Run Code Online (Sandbox Code Playgroud)

...除了调用访问器之外什么也不做,但忽略了返回.编译器会抱怨它,你不应该忽略它.

你的主要问题是:

   NSEntityDescription *entity = [NSEntityDescription entityForName:@"IItem" inManagedObjectContext:managedObjectContext];
Run Code Online (Sandbox Code Playgroud)

...因为您没有使用self.managedObjectContext[self managedObjectContext]访问上下文.这使得你可能会获得一个零上下文或一个你不想要的上下文.你在这里犯了同样的错误:

 NSMutableArray* mutableFetchCategory = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你不需要一个可变数组,你不想复制它.您将最终得到重复的托管对象,这将导致各种问题.有些参考资料使用过这种形式,但后来又得到纠正.

整个块以:

if ([mutableFetchCategory count] > 0) 
Run Code Online (Sandbox Code Playgroud)

毫无意义.它只是创建了已复制数组的进一步复制.

你使这变得比它需要的复杂得多.只需在Xcode4中使用"Core Data Fetch With Predicate"片段并填写空白即可.

-(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
}
Run Code Online (Sandbox Code Playgroud)

fetchedObjects将是NSManagedObject对象或IItem对象的数组,具体取决于您是否提供了自定义NSManagedObject子类.