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

时间:2015-04-30 17:05:15

标签: ios core-data many-to-many

IOS newb来自mysql后台处理与Web服务器后端绑定的应用程序。如果我有两个实体或对象享有多对多关系,例如item和tag,那么在MYSQL中我将有三个表,项目表,标签表和第三个标签项关系表。

表1标签 ID |标签

表2项目 ID |项目

表3 Tagitems ID |标签识别|的itemid

如果我想在核心数据中执行此操作,那么还有三个实体是合适的吗?

实体1:标签 ID |标记名

实体2:项目 ID | ITEMNAME

实体3:Tagitems ID |标签识别|的itemid

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

1 个答案:

答案 0 :(得分:1)

如果您的中间表没有其他属性,那么您不需要自己建模。只需创建从Entity 1Entity 2的多对多关系,以及从Entity 2Entity 1的多对多关系,并使每个关系与另一个关系相反。 CoreData将为您构建和管理中间表(并且它的存在很大程度上是对您隐藏的)。模型编辑器看起来应该是这样的:

enter image description here

生成子类时,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 1Entity 3的关系应该是多对的,但是它的倒数应该是-1;同样从Entity 2Entity 3应该是多个,并且它与一个相反:

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