Я пытаюсь настроить простую модель базовых данных, как показано ниже:
Order(code, customer)
Book(code, title, price)
OrderBook(order_code, book_code, quantity)
Из документации Core Data я вижу, что невозможно смоделировать отношение «многие ко многим», добавив к нему атрибуты. По этой причине я смоделировал это следующим образом.
где:
- от
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>
)? Если да, есть ли механизм для повышения производительности при получении запроса?
Помните, что таблица книг уже заполнена.
Надеюсь, это понятно. Заранее спасибо.