Моделируйте и заполняйте базовые данные отношения многие ко многим с атрибутом - PullRequest
7 голосов
/ 16 февраля 2012

Я пытаюсь настроить простую модель базовых данных, как показано ниже:

Order(code, customer)
Book(code, title, price)
OrderBook(order_code, book_code, quantity)

Из документации Core Data я вижу, что невозможно смоделировать отношение «многие ко многим», добавив к нему атрибуты. По этой причине я смоделировал это следующим образом.

enter image description here

где:

  • от Order до OrderBook существует отношение один-ко-многим с правилом удаления Каскад
  • форма OrderBook до Order существует отношение один к одному с правилом удаления Без действия

То же самое относится к Book и OrderBook.

Первый вопрос: Эта модель действительна?

Предполагая, что модель в порядке, я создал соответствующие NSManagedObject подклассы.

Book.h/.m
Order.h/.m
OrderBook.h/.m

Тем не менее, у меня есть необходимость заполнить соответствующую базу данных с помощью механизма Core Data. Для этого я создал соответствующие категории, подобные следующим, где каждая категория отвечает за создание себя (для поддержки инкапсуляции объектов).

Book+Creation.h/.m
Order+Creation.h/.m
OrderBook+Creation.h/.m

Например, в категории Book+Creation есть метод класса, подобный следующему:

+ (Book *)bookWithXMLElement:(GDataXMLElement *)xmlElement inManagedObjectContext:(NSManagedObjectContext *)context;

Теперь у меня есть проблема, и я не знаю, как ее решить.

Популяция модели должна происходить в разное время. Сначала заполняется таблица для книг (я создаю каталог книг из XML-файла). После завершения я могу заполнить таблицы заказов и книг заказов. Для заполнения этих таблиц я использую XML-файл, подобный следующему:

<orders>
  <order>
     <code>1234</code>
     <book>2567</book>
     <customer>299</customer>
     <quantity>4</quantity>
  </order>
</orders>

Чтобы создать управляемый объект Order, я создал следующий метод в его категории Order+Creation:

+ (Order *)orderWithXMLElement:(GDataXMLElement *)xmlElement inManagedObjectContext:(NSManagedObjectContext *)context;

После создания объект передается в OrderBook+Creation категорию метода класса для создания OrderBook управляемого объекта:

+ (OrderBook *)orderWithXMLElement:(GDataXMLElement *)xmlElement withOrder:(Order*)order inManagedObjectContext:(NSManagedObjectContext *)context
{
  OrderBook* orderBook = [NSEntityDescription insertNewObjectForEntityForName:@"OrderBook" inManagedObjectContext:context];
  orderBook.order = order;
  //orderBook.book = <-- how can I retrieve the book?

  return orderBook;
}

Чего не хватает, так это как создать (или получить) объект Book, чтобы назначить его объекту OrderBook.

Второй вопрос: Как я могу получить объект Book и присвоить его OrderBook? Нужно ли создавать NSFetchRequest для получения нужного объекта Book (тот, который имеет тот же код в XML-файле, например, <book>2567</book>)? Если да, есть ли механизм для повышения производительности при получении запроса?

Помните, что таблица книг уже заполнена.

Надеюсь, это понятно. Заранее спасибо.

1 Ответ

3 голосов
/ 18 февраля 2012
  1. Должно быть "обнулять", а не "бездействовать" для отношений "один к одному".
  2. Да, вы правы, вам нужен запрос на получение.

Если у вас есть проблемы с производительностью при запросе на выборку (трудно сказать, не зная числа, о которых идет речь), вы можете извлечь весь набор книг в память (опять же, это может быть непрактично в зависимости от чисел), а затем использовать фильтрацию массивов Перечисление, чтобы найти конкретный элемент, но вы должны определенно построить и профилировать самый простой вариант в первую очередь.

Типы правил удаления описаны здесь , значение nullify является корректным для отношения «один к одному» от orderBook к Book и Order:

аннулирует

Установить обратное отношение для объектов в пункте назначения равным нулю.

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

Это означает, что если вы удалите книгу заказов, она будет удалена из наборов заказов и книг в книгах Order и Book.

...