基于关系向实体添加核心数据记录



我有两个实体ProductModel和OrderItem。ProductModel具有关系集prodToOrder、inverse-orderToProd和one-to-Many。OrderItem具有与orderToProd的关系集,其prodToOrder和Many-to-one相反。

我添加了没有问题的ProductModel数据,但我的问题是,在我将新记录插入OrderItem,然后返回并获取OrderItem之后,产品名称为null。如果我同时将两个记录插入ProductModel和OrderItem,它将起作用,但我没有同时添加这两个实体,因为我需要选择已经存在的产品名称并将详细信息添加到OrderItem。

我认为问题是,除非我同时向两个实体插入记录,否则将不会创建关系。

I在以下功能中执行新的订单项:

-(IBAction)cmdSave:(id)sender{//获得最大产量NSNumber*orderitemid=[self-getMaxOrderItemID];NSNumber*addValue=[NSNumber numberWithInteger:([orderitemid integerValue]+1)];NSManagedObjectContext*context=[self-managedObjectContext];//创建新的托管对象OrderItem*orderDetails=[NEntityDescription insertNewObjectForEntityForName:@"OrderItem"inManagedObjectContext:context];ProductModel*prod=[NEntityDescription insertNewObjectForEntityForName:@"ProductModel"inManagedObjectContext:context];orderDetails.order id=[NSNumber numberWithInteger:[addValue integerValue]];orderDetails.product-id=[NSNumber numberWithInteger:[product-id-integerValue]];orderDetails.qty=[NSNumber numberWithInteger:[self.txtQty.text integerValue]];orderDetails.price=[NSDecimalNumber numberWithDouble:[self.txtPrice.text doubleValue]];orderDetails.total=[NSDecimalNumber numberWithDouble:[self.txtTotal.textdoubleValue]];//如果我执行以下语句,它将向ProductModel实体插入产品id,但我不想这样做,以及在不插入ProductModel的情况下如何维护关系。***prod.product-id=[NSNumber numberWithInteger:[product id integerValue]];orderDetails.orderToProd=产品;***NSError*error=nil;//将对象保存到持久存储if(![context save:&error]){NSLog(@"无法保存!%@@%@",error,[error localizedDescription]);}}

我很感激你在这方面的帮助或建议。

您还没有掌握对象模型的主要要点。你应该忘记所有的id。您使用外键将实体链接在一起,这是错误的方式。存在消除这些ID和外键的关系。你设定了关系,你就完了。

orderItem.productModel = productModel; 

正如你所看到的,这是非常简单和直接的。你的困惑部分来自于旧的数据库think-left联接心态。如果您的具体订单项属于某个产品模型,则该关系应称为"productModel",而不是"itemToProd"。尽可能保持简单的英语。

顺便说一句,我想指出的其他怪癖很少。当分配NSNumber属性时,并且您已经从整数中获得了NSNumber,那么这就足够了:

entity.property = number; 

不是

entity.property = [NSNumber numberWithInteger:[number integerValue]];

再次检查您的关系。产品可以有多个OrderItem,但OrderItem应该只有一个产品。所以像Product.orderItems这样的东西是To Many,而相反的是OrderItem.Product是To One。

然后你应该能够创建尽可能多的产品项目,就像一样

    ProductModel *prodA  =[NSEntityDescription insertNewObjectForEntityForName:@"ProductModel" inManagedObjectContext:context];
    [prod setValue:@"Product A" forKey:@"name"];
    [prod setValue:[NSNumber numberWithInt:1] forKey:@"productID"];
    ProductModel *prodB  =[NSEntityDescription insertNewObjectForEntityForName:@"ProductModel" inManagedObjectContext:context];
    [prod setValue:@"Product B" forKey:@"name"];
    [prod setValue:[NSNumber numberWithInt:2] forKey:@"productID"];
etc...

现在要创建OrderItem,请执行以下操作:

    OrderItem *orderItem1  =[NSEntityDescription insertNewObjectForEntityForName:@"OrderItem" inManagedObjectContext:context];
    [orderItem1 setValue:prodA forKey:@"product"];
    [orderItem1 setValue:[NSNumber numberWithInt:10] forKey:@"quantity"];
etc...

不需要使用productID来链接OrderItemProductOrderItem.product属性直接指向Product对象。

现在保存更改-此时将验证模型,因此您必须更正所有关系,否则将因验证错误而失败。

[context save];

要获得产品的所有OrderItems的列表,只需使用prodA.orderItems,它将返回一个OrderItems NSSet。

最新更新