2012-10-31 126 views
0

我有一个核心数据模型,有一对多的关系,有一个类别,它可以包含许多子类别。核心数据谓词对许多

类别< ---- >>子目录

我试图执行一个取来检查,如果一个特定的类别中包含有特定名称的子目录。假设我有以下两个类别,我想要查看名为“Fruits”的类别中是否有任何子类别名称为“Apple”。

Vetegables 
    - Carrot 
    - Lettuce 

Fruits 
    - Apple 
    - Orange 
    - Pear 

代码:

- (SubCategory *)searchForSubCategoryWithName:(NSString *)subCategory 
            inCategory:(Category *)category 
{ 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"SubCategory" inManagedObjectContext:self.beer.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == [c] %@", subCategory]; 
    [fetchRequest setPredicate:predicate]; 

    NSError *error; 
    NSArray *fetchedObjects = [self.beer.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

    if (fetchedObjects != nil && fetchedObjects.count > 0) { 
     return [fetchedObjects objectAtIndex:0]; 
    } 
    else { 
     return nil; 
    } 
} 
+0

:)对我来说看起来不错,那么你的问题是什么? – Tobi

+0

NSPredicate * predicate = [NSPredicate predicateWithFormat:@“name == [c]%@ and category ==%@”,subCategory,category]; – NeverBe

回答

2

尽量寻找其中有你喜欢的不是其他方式,然后从返回结果category.subcategory子类别类别的实体。我不知道你的NSManagedObjects看怎么样,但试试这个:

- (SubCategory *)searchForSubCategoryWithName:(NSString *)subCategory 
            inCategory:(Category *)category 
{ 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Category" inManagedObjectContext:self.beer.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"subcategory.name == [c] %@ AND name == %@", subCategory, category.name]; 
    [fetchRequest setPredicate:predicate]; 

    NSError *error; 
    NSArray *fetchedObjects = [self.beer.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

    if (fetchedObjects != nil && fetchedObjects.count > 0) { 
     Category *categoryManagedObject = [fetchedObjects objectAtIndex:0]; 
     return categoryManagedObject.subcategory; 
    } 
    else { 
     return nil; 
    } 
} 

...或者只是添加类别到您的谓词,你应该在你的子类别管理对象定义:

- (SubCategory *)searchForSubCategoryWithName:(NSString *)subCategory 
             inCategory:(Category *)category 
    { 
     NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
     NSEntityDescription *entity = [NSEntityDescription entityForName:@"Category" inManagedObjectContext:self.beer.managedObjectContext]; 
     [fetchRequest setEntity:entity]; 

     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == [c] %@ AND category == %@", subCategory, category]; 
     [fetchRequest setPredicate:predicate]; 

     NSError *error; 
     NSArray *fetchedObjects = [self.beer.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

     if (fetchedObjects != nil && fetchedObjects.count > 0) { 
      return [fetchedObjects objectAtIndex:0]; 
     } 
     else { 
      return nil; 
     } 
    } 
+0

非常感谢,完美的工作 – Vikings