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

时间:2012-02-16 11:01:32

标签: ios core-data attributes many-to-many populate

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

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

从核心数据文档中我看到,无法对添加到其属性的多对多关系进行建模。出于这个原因,我将其模仿如下。

enter image description here

其中:

  • OrderOrderBook有一个一对多关系,其中包含删除规则级联
  • OrderBookOrder形成一对一关系,其中包含删除规则无操作

同样适用于BookOrderBook

第一个问题:此型号有效吗?

假设模型没问题,我创建了相应的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>)?如果是这样,是否有一种机制来提高获取请求的性能?

请记住,图书表已填充。

希望很清楚。先感谢您。

1 个答案:

答案 0 :(得分:3)

  1. 对于一对一的关系,应该“无效”而不是“无动作”。
  2. 是的,你是对的,你需要一个获取请求。
  3. 如果你对获取请求有性能问题(很难说不知道所涉及的数字)你可以将整套书籍取回内存(再次,根据数字可能不实用)然后使用数组过滤/枚举以查找特定项目,但您应该首先构建和分析最简单的选项。

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

      

    <强>抵消

         

    将目标对象的反向关系设置为null。

         

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

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