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