如何使用Coredata与NSFetchedResultsController的有序关系

  • 我有一个项目实体和一个标签实体。
  • 项目可以有多个标签和标签可以链接到多个项目(多对多关系)。
  • 这种关系是一种“有序关系”(使用IOS5中的有序关系)。
  • 我想使用NSFetchedResultsController为标签获取所有项目。

    查询:

  • 甚至可以使用NSFetchRequest和NSFetchedResultsController的有序关系吗?
  • 我如何指定“排序描述符”?
  • 我试了两个谓词。 第一个没有给出任何结果,第二个没有给出结果。 为什么第一个不起作用? 我又如何指定排序描述符来使用CoreData自动管理这个关系的排序顺序?
  • 没有工作:[NSPredicate predicateWithFormat:@“ANY tags ==%@”,yyy];

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


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

    您只需从该媒体资源中读取标签即可。

    希望这可以帮助!

    链接地址: http://www.djcxy.com/p/36145.html

    上一篇: How to use Coredata ordered relationships with NSFetchedResultsController

    下一篇: NSFetchedResultsController not sorting on initial fetch