我有两个实体ProductModel和OrderItem。 ProductModel具有关系集prodToOrder,inverse orderToProd和one to Many。 OrderItem与orderToProd的关系设置为逆prodToOrder和多对一。
我添加了ProductModel数据没有问题,但我的问题是在我向OrderItem插入新记录然后返回并获取OrderItem,产品名称为null。如果我同时将两个记录同时插入ProductModel和OrderItem,它将起作用,但我不会同时添加两个实体,我需要选择已有的产品名称并将详细信息添加到OrderItem。
我认为问题在于,除非我同时向两个实体插入记录,否则不会创建关系。
我在下面的函数中执行新的OrderItem:
- (IBAction)cmdSave:(id)sender { //Get max productid NSNumber *orderitemid =[self getMaxOrderItemID]; NSNumber *addValue= [NSNumber numberWithInteger:([orderitemid integerValue] + 1) ]; NSManagedObjectContext *context = [self managedObjectContext]; // Create a new managed object OrderItem *orderDetails = [NSEntityDescription insertNewObjectForEntityForName:@"OrderItem" inManagedObjectContext:context]; ProductModel *prod =[NSEntityDescription 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.text doubleValue]]; //if i do the following statement it will insert product id to ProductModel entity but i do not want to do that and how do i maintain relationships without inserting in to ProductModel. *** prod.product-id=[NSNumber numberWithInteger:[product-id integerValue] ]; orderDetails.orderToProd=prod; *** NSError *error = nil; // Save the object to persistent store if (![context save:&error]) { NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]); } }
我很感谢您的帮助或建议。
答案 0 :(得分:0)
再次检查您的关系。产品可以有许多OrderItem,但OrderItem应该只有一个Product。所以像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
链接OrderItem
和Product
。 OrderItem.product
属性直接指向Product
对象。
现在保存更改 - 此时模型将被验证,因此您必须使所有关系正确,否则它将因验证错误而失败。
[context save];
要获取产品的所有OrderItem列表,只需使用prodA.orderItems
返回OrderItems的NSSet。
答案 1 :(得分:0)
你还没有掌握对象模型的主要要点。你应该忘记所有的ID。您正在使用外键将实体链接在一起 - 这是错误的方式。存在消除这些ID和外键的关系。你设定了关系,你就完成了。
orderItem.productModel = productModel;
正如您所看到的,这非常简单直接。您的部分困惑来自旧的数据库 - 思考左连接心态。如果您的具体订单商品属于某个产品型号,则该关系应称为“productModel”,而不是“itemToProd”。尽可能保持简单的英语。
BTW我想指出的其他怪癖很少。分配NSNumber
属性并且您已经从整数中获得NSNumber
时,这就足够了:
entity.property = number;
不
entity.property = [NSNumber numberWithInteger:[number integerValue]];