我正在尝试设置一个简单的Core Data模型,如下所示:
Order(code, customer)
Book(code, title, price)
OrderBook(order_code, book_code, quantity)
从核心数据文档中我看到,无法对添加到其属性的多对多关系进行建模。出于这个原因,我将其模仿如下。
其中:
Order
到OrderBook
有一个一对多关系,其中包含删除规则级联 OrderBook
到Order
形成一对一关系,其中包含删除规则无操作 同样适用于Book
和OrderBook
。
第一个问题:此型号有效吗?
假设模型没问题,我创建了相应的NSManagedObject
子类。
Book.h/.m
Order.h/.m
OrderBook.h/.m
也就是说,我有必要通过核心数据机制填充相应的数据库。为此,我创建了相应的类别,如下所示,其中每个类别负责创建自己(以维护对象封装)。
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>
)?如果是这样,是否有一种机制来提高获取请求的性能?
请记住,图书表已填充。
希望很清楚。先感谢您。
答案 0 :(得分:3)
如果你对获取请求有性能问题(很难说不知道所涉及的数字)你可以将整套书籍取回内存(再次,根据数字可能不实用)然后使用数组过滤/枚举以查找特定项目,但您应该首先构建和分析最简单的选项。
删除规则类型描述为here,nullify对于从orderBook到Book and Order的一对一关系是正确的:
<强>抵消强>
将目标对象的反向关系设置为null。
例如,如果删除部门,请将所有当前成员的部门设置为null。只有当员工的部门关系是可选的,或者如果您确保在下一次保存操作之前为每个员工设置新部门时,这才有意义。
这意味着如果删除orderBook,则会从Order and Book实体中的orderBooks和bookOrders集中删除它。