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]];
您可以简单地从该财产为您的标签读取。
希望这会有所帮助!
非常感谢。我会尝试。为什么需要将NSSet更改为NSArray?顺便说一下它的NSOrderedSet有序关系。这是你的意思吗?一个Item可以有很多标签,这就是为什么我不想使用keypath一次获取所有对象。 – siasl
无论如何,我总是使用NSArray,所以如果需要的话我可以应用一个排序描述符。它不会带走任何东西。我认为NSOrderedSet将保持标签在CoreData中的插入顺序(虽然不确定)。 CoreData总是获取故障关系。只要您尝试访问数据,它就会解决该关系。不要担心一次加载所有对象。 –
另一个问题:为什么下面的谓词不起作用:[NSPredicate predicateWithFormat:@“ANY tags ==%@”,yyy]; 这一个工作:但我认为效率较低:[NSPredicate predicateWithFormat:@“ANY tags。tagID ==%@“,xxx]; – siasl