说我有NSManagedObject A,它与NSManagedObject B有多对多的关系。 我有一个保存的A和B实例(尚未关联)
现在我希望A在其关系中保存B的实例两次,这当然是一个集合。 但是,由于它是一个集合,它只存储一个B的引用。
参见:(未检查语法)
NSArray *tmpArray = [NSArray arrayWithObjects: B1, B1, nil];
[A setB: [NSSet setWithArray: tmpArray]];
- >只有一个B存储在那种关系中..
是否可以跟踪两个B?
答案 0 :(得分:4)
你不能这样做。核心数据不是维护数组而是维护对象图。
对象图存储对象之间的关系。由于每个对象都是唯一的,因此没有任何信息可能会产生重复的关系。假设您有一个Person
实例Jane
,其brothers
关系包含三个对象Steve
,John
和Mike
。与Steve
建立两种关系在逻辑上是荒谬的,因为对象模型的真实史蒂夫不是简的兄弟两次。即使简确实有两个名叫史蒂夫的兄弟,他们仍然是单独的个体,需要他们自己的对象在对象图中表示它们。
如果您发现自己认为需要重复关系,那么您可能误解了对象图的工作原理。
答案 1 :(得分:1)
我有一个类似的问题并搜索但找不到任何东西。事实上,我正在考虑这种关系错误。
应用正按顺序在Items
上安排一堆Board
重复播放。
EX。做A,做B,做C,再做一次,做D
我创建了一个很好的老式联接表,其中包含Item
,Board
和名为BoardItemPositon
的董事会职位。
从Board
实体中,您可以隐藏所有连接表的混乱,并获取并设置一个数组。
@implementation Board
@dynamic boardItems;
- (void)setItems:(NSArray *)items{
//the ordered set of links
NSMutableOrderedSet *boardItemSet = [NSMutableOrderedSet new];
int i = 1;
for (Item *item in items) {
BoardItemPosition *boardItemPosition = (BoardItemPosition *)[NSEntityDescription insertNewObjectForEntityForName:@"BoardItemPosition"
inManagedObjectContext:[self managedObjectContext]];
NSNumber *num = [NSNumber numberWithInt:i++];
[boardItemPosition setItemPosition:num];
[boardItemPosition setItem:item];
[boardItemSet addObject:boardItemPosition];
}
//delete the old links
for (BoardItemPosition *boardItemPosition in [self boardItems]) {
[self.managedObjectContext deleteObject:[self.managedObjectContext objectWithID:boardItemPosition.objectID]];
}
//set the new links
[self setBoardItems:boardItemSet];
}
- (NSArray *)items{
//pull out item and add to array
NSMutableArray *itemArray = [NSMutableArray new];
for (BoardItemPosition *boardItemPosition in [self boardItems]) {
[itemArray addObject:[boardItemPosition item]];
}
return itemArray;
}