核心数据:如何在一个关系中两次保存对象

时间:2010-09-16 19:19:14

标签: core-data relationship

说我有NSManagedObject A,它与NSManagedObject B有多对多的关系。 我有一个保存的A和B实例(尚未关联)

现在我希望A在其关系中保存B的实例两次,这当然是一个集合。 但是,由于它是一个集合,它只存储一个B的引用。

参见:(未检查语法)

NSArray *tmpArray = [NSArray arrayWithObjects: B1, B1, nil];
[A setB: [NSSet setWithArray: tmpArray]];

- >只有一个B存储在那种关系中..

是否可以跟踪两个B?

2 个答案:

答案 0 :(得分:4)

你不能这样做。核心数据不是维护数组而是维护对象图。

对象图存储对象之间的关系。由于每个对象都是唯一的,因此没有任何信息可能会产生重复的关系。假设您有一个Person实例Jane,其brothers关系包含三个对象SteveJohnMike。与Steve建立两种关系在逻辑上是荒谬的,因为对象模型的真实史蒂夫不是简的兄弟两次。即使简确实有两个名叫史蒂夫的兄弟,他们仍然是单独的个体,需要他们自己的对象在对象图中表示它们。

如果您发现自己认为需要重复关系,那么您可能误解了对象图的工作原理。

答案 1 :(得分:1)

我有一个类似的问题并搜索但找不到任何东西。事实上,我正在考虑这种关系错误。

应用正按顺序在Items上安排一堆Board重复播放。

EX。做A,做B,做C,再做一次,做D

我创建了一个很好的老式联接表,其中包含ItemBoard和名为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;
}