ios/xcode/coredata: 多对多关系的数据模型

ios/xcode/coredata: Data model for many to many relationships

IOS 来自 mysql 的新人后台正在开发与 Web 服务器后端相关的应用程序。如果我有两个实体或对象享有多对多关系,例如项目和标签,在 MYSQL 中我将有三个 table,项目的 table,项目的 table标签和第三个 table 标签项关系。

Table 1 个标签 ID|标签

Table 2 项 ID|项目

Table 3 个标签项 ID|t​​agid|itemid

如果我想在核心数据中执行此操作,同时拥有三个实体是否合适?

实体 1:标签 id|标签名

实体 2:项目 id|项目名称

实体 3:Tagitems id|tagid|itemid

看起来很简单,但只是想确保我正确理解核心数据。

如果你的中级table没有其他属性,那你就不需要自己建模了。只需创建一个从 Entity 1Entity 2 的一对多关系,以及一个从 Entity 2Entity 1 的一对多关系,并使每个关系与另一个关系相反。 CoreData 将为您构建和管理中间 table(它的存在在很大程度上对您隐藏)。模型编辑器应如下所示:

当您生成子类时,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 "in the shadows"。所以你可以这样做:

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

如果你的中间 table 确实有其他属性,那么你应该实现 Entity 3,并添加你需要的任何属性(但不要实现 'id' 键 - 留给核心数据)。从 Entity 1Entity 3 的关系应该是一对多的,但它的倒数应该是一对一的;同样从 Entity 2Entity 3 应该是一对多的,它的逆对一:

Entity 2 <---->> Entity 3 <<----> Entity 1