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|tagid|itemid
如果我想在核心数据中执行此操作,同时拥有三个实体是否合适?
实体 1:标签
id|标签名
实体 2:项目
id|项目名称
实体 3:Tagitems
id|tagid|itemid
看起来很简单,但只是想确保我正确理解核心数据。
如果你的中级table没有其他属性,那你就不需要自己建模了。只需创建一个从 Entity 1
到 Entity 2
的一对多关系,以及一个从 Entity 2
到 Entity 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 1
到 Entity 3
的关系应该是一对多的,但它的倒数应该是一对一的;同样从 Entity 2
到 Entity 3
应该是一对多的,它的逆对一:
Entity 2 <---->> Entity 3 <<----> Entity 1
IOS 来自 mysql 的新人后台正在开发与 Web 服务器后端相关的应用程序。如果我有两个实体或对象享有多对多关系,例如项目和标签,在 MYSQL 中我将有三个 table,项目的 table,项目的 table标签和第三个 table 标签项关系。
Table 1 个标签 ID|标签
Table 2 项 ID|项目
Table 3 个标签项 ID|tagid|itemid
如果我想在核心数据中执行此操作,同时拥有三个实体是否合适?
实体 1:标签 id|标签名
实体 2:项目 id|项目名称
实体 3:Tagitems id|tagid|itemid
看起来很简单,但只是想确保我正确理解核心数据。
如果你的中级table没有其他属性,那你就不需要自己建模了。只需创建一个从 Entity 1
到 Entity 2
的一对多关系,以及一个从 Entity 2
到 Entity 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 1
到 Entity 3
的关系应该是一对多的,但它的倒数应该是一对一的;同样从 Entity 2
到 Entity 3
应该是一对多的,它的逆对一:
Entity 2 <---->> Entity 3 <<----> Entity 1