4
  1. 我有一个项目实体和一个标签实体。
  2. 项目可以有多个标签,标签可以链接到多个项目(多对多关系)。
  3. 该关系是“有序关系”(在 IOS5 中使用有序关系)两种方式。

我想使用 NSFetchedResultsController 获取标签的所有项目。

查询:

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

没用:[NSPredicate predicateWithFormat:@"ANY tags == %@", yyy];

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

4

1 回答 1

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]];

您可以简单地从该属性中读取标签。

希望这可以帮助!

于 2012-09-04T12:22:47.703 回答