IOS newb来自mysql后台处理与Web服务器后端绑定的应用程序。如果我有两个实体或对象享有多对多关系,例如item和tag,那么在MYSQL中我将有三个表,项目表,标签表和第三个标签项关系表。
表1标签 ID |标签
表2项目 ID |项目
表3 Tagitems ID |标签识别|的itemid
如果我想在核心数据中执行此操作,那么还有三个实体是合适的吗?
实体1:标签 ID |标记名
实体2:项目 ID | ITEMNAME
实体3:Tagitems ID |标签识别|的itemid
看起来很简单但只是想确保我正确理解核心数据。
答案 0 :(得分:1)
如果您的中间表没有其他属性,那么您不需要自己建模。只需创建从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
的关系应该是多对的,但是它的倒数应该是-1;同样从Entity 2
到Entity 3
应该是多个,并且它与一个相反:
Entity 2 <---->> Entity 3 <<----> Entity 1