Core-Data: как сохранить объект дважды в одном отношении - PullRequest
2 голосов
/ 16 сентября 2010

говорят, что у меня есть NSManagedObject A, который имеет отношение многие ко многим к NSManagedObject B. У меня есть один сохраненный экземпляр A и B. (еще не связаны)

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

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

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

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

Можно ли отслеживать оба B?

Ответы [ 2 ]

4 голосов
/ 17 сентября 2010

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

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

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

1 голос
/ 27 мая 2012

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

Приложение упорядочивает связку 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;
}
...