Ios 使用属性对核心数据进行多对多关系建模和填充

Ios 使用属性对核心数据进行多对多关系建模和填充,ios,core-data,attributes,many-to-many,populate,Ios,Core Data,Attributes,Many To Many,Populate,我试图建立一个简单的核心数据模型,如下所示: Order(code, customer) Book(code, title, price) OrderBook(order_code, book_code, quantity) + (Book *)bookWithXMLElement:(GDataXMLElement *)xmlElement inManagedObjectContext:(NSManagedObjectContext *)context; <orders> &

我试图建立一个简单的核心数据模型,如下所示:

Order(code, customer)
Book(code, title, price)
OrderBook(order_code, book_code, quantity)
+ (Book *)bookWithXMLElement:(GDataXMLElement *)xmlElement inManagedObjectContext:(NSManagedObjectContext *)context;
<orders>
  <order>
     <code>1234</code>
     <book>2567</book>
     <customer>299</customer>
     <quantity>4</quantity>
  </order>
</orders>
从核心数据文档中,我看到不可能为添加属性的多对多关系建模。出于这个原因,我将其建模如下

其中:

  • Order
    OrderBook
    与删除规则存在一对多关系Cascade
  • OrderBook
    Order
    与删除规则存在一对一的关系无操作
这同样适用于
Book
OrderBook

第一个问题:此模型有效吗

假设模型正常,我创建了相应的
NSManagedObject
子类

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

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

Order(code, customer)
Book(code, title, price)
OrderBook(order_code, book_code, quantity)
+ (Book *)bookWithXMLElement:(GDataXMLElement *)xmlElement inManagedObjectContext:(NSManagedObjectContext *)context;
<orders>
  <order>
     <code>1234</code>
     <book>2567</book>
     <customer>299</customer>
     <quantity>4</quantity>
  </order>
</orders>
现在我有一个问题,我不知道如何解决它

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

Order(code, customer)
Book(code, title, price)
OrderBook(order_code, book_code, quantity)
+ (Book *)bookWithXMLElement:(GDataXMLElement *)xmlElement inManagedObjectContext:(NSManagedObjectContext *)context;
<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
class方法类别,以创建
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;
}
+(OrderBook*)orderWithXMLElement:(GDataXMLElement*)xmlElement withOrder:(Order*)在托管对象上下文中的顺序:(NSManagedObjectContext*)上下文
{
OrderBook*OrderBook=[NSEntityDescription insertNewObjectForEntityForName:@“OrderBook”在ManagedObjectContext:context中];
orderBook.order=订单;
//orderBook.book=
  • 对于to-one关系,应该是“null”而不是“no-action”
  • 是的,你说得对,你需要一个取回请求
  • 如果您在获取请求中遇到性能问题(如果不知道所涉及的数字,很难说),您可以将整套书籍获取到内存中(同样,根据数字可能不实用)然后使用数组筛选/枚举来查找特定项,但您肯定应该首先构建和分析最简单的选项

    删除规则类型如下所述,nullify对于orderBook到Book和Order之间的to-one关系是正确的:

    取消

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

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


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

    对于当前模型,如果您有一个同时具有Book和Order属性的Order Book对象,如果您删除Book或Order,则会删除Order Book对象。这是您想要的吗?@jrturton感谢您的回复。是的,这正是我想要的。您有什么建议吗?@jrtuton删除订单或书籍时,订单簿obj(订单簿行,用db表示)也将被删除。谢谢。表格填充是在后台通过NSO操作完成的。这是什么意思“您肯定应该首先构建和分析最简单的选项”?+1以获得您的支持。我的意思是,使用获取请求编写它(您只需要创建一次,您可以修改谓词)并在填充订单时使用返回的book对象。除非这会导致问题,否则不要尝试任何其他操作。一个简单的问题是,从OrderBook到order之间存在一对一的删除规则关系是否正确?无操作?当我设置此项时,编译器会给我一个一致性错误。可能如果我使用NULLIFY规则可能更正确。你认为呢?谢谢。是的,你的“无操作”都应该是无效的,我之前误读了你的问题(集中在级联部分)谢谢。但是如果没有操作而不是无效,会有什么问题?如果没有操作,如果我从OrderBook实体(表)NSSET中删除一行(对于Book和Order)更新不正确,是真的吗?你能给我举个例子吗。