Где я могу найти хороший пример отношения Core Data ко многим? - PullRequest
9 голосов
/ 23 марта 2011

Есть ли у кого-нибудь учебник или исходный код, который показывает используемое отношение ко-многим, где пользователь добавляет элементы на лету?Я просто хотел бы взглянуть, потому что чтение об этом не очень помогло.

Ответы [ 8 ]

23 голосов
/ 23 марта 2011

Люди часто путаются в отношениях «многие-многие», потому что одна сущность представляет отношение как набор, а другая представляет его как один объект. Возьмите следующие лица:

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 отношения - это всего лишь один объект с одним объектом.

Это действительно довольно просто, когда вы начинаете мыслить объектами, а не базами данных. Каждый объект, который вы вставляете в контекст, уникален, даже если он разделяет атрибуты с другими объектами того же объекта / класса. Вот почему вы можете устанавливать отношения между конкретными объектами, не беспокоясь о значениях, хранящихся в их атрибутах.

10 голосов
/ 23 марта 2011

Вот пример отношения «один ко многим», если вы настроили отношения так, чтобы они имели обратное, с ними довольно легко управлять. в конце атрибут chilren у Entity1 будет содержать entity2 и entity3

Entity1 *entity1=[NSEntityDescription insertNewObjectForEntityForName:@"Entity1" inManagedObjectContext:self.managedObjectContext];
Entity2 *entity2=[NSEntityDescription insertNewObjectForEntityForName:@"Entity2" inManagedObjectContext:self.managedObjectContext];
Entity2 *entity3=[NSEntityDescription insertNewObjectForEntityForName:@"Entity2" inManagedObjectContext:self.managedObjectContext];

[entity2 setParentEntity:entity1];
[entity3 setParentEntity:entity1];
NSError *error;
[[self managedObjectContext]save:&error];

NSSet *set=[entity1 children];

enter image description here

3 голосов
/ 23 марта 2011

Загрузите пример кода iPhoneCoreDataRecipes . Это полная рабочая демонстрация Core Data и отличный способ ознакомиться с концепциями.

3 голосов
/ 23 марта 2011

В настоящее время я использую эту электронную книгу, и она очень хорошо написана: она объясняет и показывает, как создавать модели данных, а также есть примеры кода.

"Pro Core Data для iOS" http://apress.com/book/view/1430233559

Надеюсь, это поможет

3 голосов
/ 23 марта 2011

Получите книгу Маркуса Зарры «Основные данные» (вы можете купить PDF, а не бумагу для мгновенного удовлетворения ...) В ней также представлены примеры в Mac OS X, но это далеко не только начало работы. Вы найдете полезные вещи, такие как управление версиями, правила перехода, оптимизация. Эта книга спасла один из моих проектов от опоздания и медлительности!

2 голосов
/ 23 марта 2011

Вы можете попробовать найти в книге «Изучите какао на Mac» источники. В главах 7 и 8.

Надеюсь, вы найдете то, что вам нужно

0 голосов
/ 28 июня 2014

Рэй Вендерлих имеет отличные учебные пособия по основным данным.

этот имеет дело со многими отношениями

, который строит

это великолепное введение из трех частей в учебник по основным данным

0 голосов
/ 23 марта 2011

См. Apple Руководство по программированию основных данных .

Я создаю объекты и добавляю их в отношения, используя mutableSetValueForKey:

mutableSetValueForKey: возвращает изменяемый прокси-объект. Если вы изменяете его содержимое, оно будет отправлять соответствующие уведомления об изменении значения ключа (KVO) для взаимосвязи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...