如果你的中间表没有其他属性,那么你不需要自己建模。只需创建从Entity 1 到Entity 2 的一对多关系,以及从Entity 2 到Entity 1 的一对多关系,并使每个关系成为另一个关系的逆。 CoreData 将为您构建和管理中间表(它的存在很大程度上对您隐藏)。模型编辑器应如下所示:
当您生成子类时,CoreData 将为关系创建 NSSet 属性:
Tag.h
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class Item;
@interface Tag : NSManagedObject
@property (nonatomic, retain) NSString * tagName;
@property (nonatomic, retain) NSSet *items;
@end
@interface Tag (CoreDataGeneratedAccessors)
- (void)addItemsObject:(Item *)value;
- (void)removeItemsObject:(Item *)value;
- (void)addItems:(NSSet *)values;
- (void)removeItems:(NSSet *)values;
@end
Item.h
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class Tag;
@interface Item : NSManagedObject
@property (nonatomic, retain) NSString * itemName;
@property (nonatomic, retain) NSSet *tags;
@end
@interface Item (CoreDataGeneratedAccessors)
- (void)addTagsObject:(Tag *)value;
- (void)removeTagsObject:(Tag *)value;
- (void)addTags:(NSSet *)values;
- (void)removeTags:(NSSet *)values;
@end
然后您可以使用核心数据生成的访问器来添加和删除关系 - 请注意,您直接设置对象之间的关系,您不必使用 ID; CoreData 正在“暗中”为您处理 ID。所以你可以这样做:
Tag *actionTag = [NSEntityDescription insertNewObjectForEntityForName:@"Tag" inManagedObjectContext:self.context];
actionTag.name = @"Action";
Tag *dramaTag = [NSEntityDescription insertNewObjectForEntityForName:@"Tag" inManagedObjectContext:self.context];
dramaTag.name = @"Drama";
Item *movie = [NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:self.context];
movie.name = @"Pride and Prejudice";
[movie addTagsObject:dramaTag];
如果您的中间表确实有其他属性,那么您应该实现Entity 3,并添加您需要的任何属性(但不要实现“id”键 - 将其留给 CoreData)。从Entity 1 到Entity 3 的关系应该是对多的,但它的逆应该是对一的;同样从Entity 2 到Entity 3 应该是多对多,它的逆对一:
Entity 2 <---->> Entity 3 <<----> Entity 1