建模和填充核心数据与属性的多对多关系

Lor*_*o B 7 attributes many-to-many core-data populate ios

我正在尝试设置一个简单的Core Data模型,如下所示:

Order(code, customer)
Book(code, title, price)
OrderBook(order_code, book_code, quantity)
Run Code Online (Sandbox Code Playgroud)

从Core Data文档中我看到,不可能对添加到其属性的多对多关系进行建模.出于这个原因,我将其模仿如下.

在此输入图像描述

哪里:

  • OrderOrderBook是有一个一对多的关系与删除规则级联
  • 形式OrderBookOrder是有一个一对一的关系与删除规则无动作

同样适用于BookOrderBook.

第一个问题:这个模型有效吗?

假设模型没问题,我创建了相应的NSManagedObject子类.

Book.h/.m
Order.h/.m
OrderBook.h/.m
Run Code Online (Sandbox Code Playgroud)

也就是说,我有必要通过核心数据机制填充相应的数据库.为此,我创建了相应的类别,如下所示,其中每个类别负责创建自己(以维护对象封装).

Book+Creation.h/.m
Order+Creation.h/.m
OrderBook+Creation.h/.m
Run Code Online (Sandbox Code Playgroud)

例如,Book+Creationcategory有一个类方法,如下所示:

+ (Book *)bookWithXMLElement:(GDataXMLElement *)xmlElement inManagedObjectContext:(NSManagedObjectContext *)context;
Run Code Online (Sandbox Code Playgroud)

现在我有一个问题,我不知道如何解决它.

模型群体必须在不同时间发生.首先填充书籍表(我正在从xml文件创建书籍目录).完成后,我就可以填充订单和订单表.要填充这些表,我正在使用如下的xml文件:

<orders>
  <order>
     <code>1234</code>
     <book>2567</book>
     <customer>299</customer>
     <quantity>4</quantity>
  </order>
</orders>
Run Code Online (Sandbox Code Playgroud)

要创建Order托管对象,我在其类别中创建了以下方法Order+Creation:

+ (Order *)orderWithXMLElement:(GDataXMLElement *)xmlElement inManagedObjectContext:(NSManagedObjectContext *)context;
Run Code Online (Sandbox Code Playgroud)

创建后,将对象传递给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;
}
Run Code Online (Sandbox Code Playgroud)

缺少的是如何创建(或检索)Book对象以将其分配给OrderBook对象.

第二个问题:如何检索Book对象并将其分配给OrderBook?我是否必须创建一个NSFetchRequest来获取正确的对象Book(例如,在xml文件中具有相同代码的对象<book>2567</book>)?如果是这样,是否有机制来提高获取请求的性能?

请记住,书表已经填充.

希望很清楚.先感谢您.

jrt*_*ton 3

  1. 对于一对一关系应该是“无效”而不是“不采取行动”。
  2. 是的,你是对的,你需要一个获取请求。

如果您在获取请求时遇到性能问题(在不知道所涉及的数字的情况下很难说),您可以将整套书籍提取到内存中(同样,根据数字可能不切实际),然后使用数组过滤/枚举来查找特定项目,但您绝对应该首先构建和配置最简单的选项。

删除规则类型描述如下,对于从 orderBook 到 Book 和 Order 的一对一关系,nullify 是正确的:

无效化

将目标处对象的逆关系设置为 null。

例如,删除一个部门,则将当前所有成员的部门设置为空。仅当员工的部门关系是可选的,或者确保在下一次保存操作之前为每个员工设置新部门时,这才有意义。

这意味着,如果您删除 orderBook,则会将其从 Order 和 Book 实体中的 orderBooks 和 bookOrders 集中删除。