2012-09-04 24 views
3
  1. 我有一个Items Entity和一个Tags Entity。
  2. 项目可以有多个标签和标签可以链接到多个项目(多对多关系为 )。
  3. 这种关系是一种“有序关系”(在IOS5中使用有序关系)两种方式。

我想使用NSFetchedResultsController获取标签的所有项目。如何使用Coredata与NSFetchedResultsController的有序关系

查询:

  1. 它甚至有可能使用与NSFetchRequest和NSFetchedResultsController有序的关系?
  2. 如何指定“排序描述符”?
  3. 我试了两个谓词。第一个没有给出任何结果,第二个没有给出结果。为什么第一个不起作用?我又如何指定排序描述符来使用CoreData自动管理这个关系的排序顺序?

没有工作:[NSPredicate predicateWithFormat:@“ANY tags ==%@”,yyy];

工作:但效率较低:[NSPredicate predicateWithFormat:@“ANY tags.tagID ==%@”,xxx];

回答

2

1 - 是的。有可能的。当您创建映射文件时,请确保您从NSSet中改变关系的类型,一个NSArray,就像这样:

@class Tags 

    @interface Entity : NSManagedObject 
    ... 
    @property (nonatomic, retain) NSOrderedSet *tags; 
    ... 
    @end 

    @interface Entity (CoreDataGeneratedAccessors) 
    ... 
    - (void)addEntityTags:(NSOrderedSet *)values; 
    - (void)removeEntityTags:(NSOrderedSet *)values; 
    ... 
    @end 

更改为:

@class Tags 

    @interface Entity : NSManagedObject 
    ... 
    @property (nonatomic, retain) NSArray *tags; 
    ... 
    @end 

    @interface Entity (CoreDataGeneratedAccessors) 
    ... 
    - (void)addEntityTags:(NSArray *)values; 
    - (void)removeEntityTags:(NSArray *)values; 
    ... 
    @end 

2 - 你可以指定一个排序描述符时创建读取请求时,就像这样:

NSFetchRequest *fetchRequest [NSFetchRequest new]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:myManagedObjectContext]; 

    [fetchRequest.setEntity: entity]; 
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"tags" ascending:<YES|NO>]]; 
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"ANY tags == %@", yyy]]; 

    NSFetchResultsController *myFetchResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:myManagedObjectContext setcionNameKeyPath:nil cacheName:nil]; 
    myFetchResultsController.delegate = self; 

    [fetchRequest release]; // Forget that if using ARC. 

    NSError *error = nil; 

    if (![myFetchResultsController performFetch:&error]) { 
     NSLog(@"Failed to fetch data: %@", error); 
    } 

3 - 如果你使用的财产,你不应该需要指定一个谓语为您的标签。如果你想你的标签进一步梳理,你可以简单地使用一种描述符阵列上,像这样:

NSSortDescriptor *tagDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"<tags field to sort on>" ascending:<YES|NO>]; 
    NSArray *sortedTags = [tagsProperty sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptors]]; 

您可以简单地从该财产为您的标签读取。

希望这会有所帮助!

+0

非常感谢。我会尝试。为什么需要将NSSet更改为NSArray?顺便说一下它的NSOrderedSet有序关系。这是你的意思吗?一个Item可以有很多标签,这就是为什么我不想使用keypath一次获取所有对象。 – siasl

+0

无论如何,我总是使用NSArray,所以如果需要的话我可以应用一个排序描述符。它不会带走任何东西。我认为NSOrderedSet将保持标签在CoreData中的插入顺序(虽然不确定)。 CoreData总是获取故障关系。只要您尝试访问数据,它就会解决该关系。不要担心一次加载所有对象。 –

+0

另一个问题:为什么下面的谓词不起作用:[NSPredicate predicateWithFormat:@“ANY tags ==%@”,yyy]; 这一个工作:但我认为效率较低:[NSPredicate predicateWithFormat:@“ANY tags。tagID ==%@“,xxx]; – siasl

相关问题