2010-09-16 76 views
2

说我有NSManagedObject A,它与NSManagedObject B有多对多的关系。 我有一个保存的A和B实例。 )核心数据:如何在一个关系中保存两次对象

现在我想让A在关系中保存两次B的实例,这当然是一个集合。 虽然,由于它的一个设置它存储B的仅一个参考

参见:(未语法选中)

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

- >只有一个B被存储在关系..

是有可能跟踪B的?

+0

TechZen是正确的。 100%同意。 所以问题是:你试图解决什么问题,这让你认为你需要存储对象A和B1之间的关系两次?如果你能解释这一点,我们可能会建议你如何以另一种方式实现你的目标。 – 2011-10-07 07:07:01

回答

4

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

对象图存储对象之间的关系。由于每个对象都是唯一的,因此不存在任何信息就没有重复关系。假设您有一个对象Person实例Jane,它具有包含三个对象Steve,JohnMikebrothers关系。如果有两个关系到Steve,因为真正的史蒂夫认为对象模型不是简的兄弟两次,这在逻辑上是荒谬的。即使简确实有两个兄弟叫史蒂夫,他们仍然是个别的人,需要他们自己的对象来代表他们在对象图中。

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

+0

现货! – 2012-05-27 14:48:33

1

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

这个应用程序安排了一堆Items在一个Board按顺序重复。

EX。做A,做B,做C,做A再做,做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; 
} 
相关问题