2010-09-16 3 views
2

сказать, что у меня есть NSManagedObject A, который имеет отношение «многие ко многим» к NSManagedObject B. У меня есть один сохраненный экземпляр A и B. (еще не связанный)Core-Data: как сохранить объект дважды в одном отношении

Теперь я хочу, чтобы A сохранял экземпляр B дважды в его отношениях, что, конечно же, является набором. Хотя, так как его набор он хранит только одну ссылку на Б.

см (не проверено синтаксис)

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

-> только один B хранится в этих отношениях ..

Is возможно ли отслеживать оба B?

+0

TechZen верен. 100% согласны. Итак, вопрос в том, в чем проблема, которую вы пытаетесь решить, заставляет вас думать, что вам нужно сохранить связь между объектами A и B1 дважды? Если вы можете это объяснить, мы сможем предложить, как вы можете достичь своей цели по-другому. –

ответ

4

Вы не можете этого сделать. Core Data не поддерживает массив, а объект-график.

Объект-граф хранит отношения между объектами. Поскольку каждый объект уникален, нет смысла дублировать отношения, поскольку он не передает никакой информации. Предположим, у вас есть объект Person экземпляр Jane, который имеет отношение brothers, которое содержит три объекта, Steve, John и Mike. Было бы логично бессмысленно иметь две связи с Steve, потому что настоящий Стив, что объектные модели не является братом Джейн дважды. Даже если бы у Джейн были два брата по имени Стив, они все равно были бы отдельными индивидуумами, требующими, чтобы их собственные объекты представляли их в объектном графе.

Если вы считаете, что вам нужны двойные отношения, то вы, вероятно, неправильно поняли, как работает объект-граф.

+0

Spot там !! –

1

У меня была подобная проблема и вы искали, но ничего не нашли. В самом деле, я неправильно думал об отношениях.

Приложение размещает кучу Items в формате Board в последовательности с повторами.

EX. Do A, Do B, Do C, Do A, Do 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; 
} 
Смежные вопросы