Люди часто путаются в отношениях «многие-многие», потому что одна сущность представляет отношение как набор, а другая представляет его как один объект. Возьмите следующие лица:
EntityA{
name:string
bees<-->>EntityB.a
}
EntityB{
name:string
a<<-->EntityA.bees
}
В EntityA отношение bees
является набором, поскольку в этом отношении может быть много объектов EntityB. Таким образом, используя кодирование Key-Value, вы должны были бы получить доступ к взаимосвязи, используя mutableSetForKey:
, расширяя все, чтобы увидеть детали, которые бы выглядели так:
NSMutableSet *muteSet=[anEntityAObj mutableSetValueForKey:@"bees"];
[muteSet addObject:aNewBObj];
[anEntityAObj setValueForKey:@"bees"];
... или более компактно:
[[anEntityAObj mutableSetValueForKey:@"bees"] addObject:aNewBObj];
Однако, если вы устанавливаете со стороны EntityB, вы добавляете только один объект, так что вы можете просто использовать setValueForKey: прямо так:
[anEntityBObj setValueForKey:anEntityAObj];
Это если вы используете универсальные экземпляры NSManagedObject для представления своих сущностей. Если вы создаете пользовательские подклассы, то у вас есть свойства и методы для настройки:
[anEntityAObj addBeesObject:anEntityBObj];
anEntityBObj.a=anEntityAObj;
Помните также, что для управляемых объектов установка одной стороны отношения, определенной как взаимная, автоматически устанавливает и другую сторону, и удаление работает аналогичным образом.
Обновление
Допустим, у меня есть 2 сущности -
Персона: с атрибутом "имя" -
Times: с атрибутом "time" - я бы
хочу установить несколько раз для каждого
имя, но как мне сказать, какое имя
я хотел бы добавить конкретное время
к
Вы создаете отношения не с атрибутами, в данном случае name
, а с объектом, в данном случае с экземплярами Person
сущности / класса. Каждый отдельный объект Person
полностью отделен от всех других объектов Person
, даже если они имеют одинаковое значение в своем атрибуте name
.
Вы должны получить ссылку на любой конкретный объект Parent
. Если вы только что вставили новый Parent
объект, то у вас уже есть ссылка на него. Если он уже был вставлен / сохранен, вы создаете выборку с предикатом, который будет возвращать нужный объект. Когда у вас есть правильный Parent
объект, вы просто добавляете Time
объекты в отношение.
Итак, если ваша сущность выглядит так: псевдокод:
Parent{
name:string
times<-->>Time.parent
}
Time{
theTime:date
parent<<-->Parent.times
}
... и вы используете универсальные NSManagedObjects для создания ваших сущностей, вы устанавливаете связь между существующим Parent
объектом и новым Time
объектом примерно так:
NSManagedObject *existingParent= //... results of a fetch
NSManagedObject *newTime=[NSEntityDescription insertNewObjectForEntityForName:@"Time" inManagedObjectContext:self.moc];
[newTime setValue:[NSDate date] forKey:@"theTime"];
[newTime setValue:existingParent forKey:@"parent"];
Обратите внимание, что если вы устанавливаете отношения со стороны объекта Time
, вы можете использовать setValue: ForKey: потому что с точки зрения объекта Time
отношения - это всего лишь один объект с одним объектом.
Это действительно довольно просто, когда вы начинаете мыслить объектами, а не базами данных. Каждый объект, который вы вставляете в контекст, уникален, даже если он разделяет атрибуты с другими объектами того же объекта / класса. Вот почему вы можете устанавливать отношения между конкретными объектами, не беспокоясь о значениях, хранящихся в их атрибутах.