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
与删除规则存在一对多关系CascadeOrderBook
- 从
到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)更新不正确,是真的吗?你能给我举个例子吗。