首页 文章

根据关系将核心数据记录添加到实体

提问于
浏览
0

我有两个实体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]);
    }
   }

我很感谢您的帮助或建议 .

2 回答

  • 0

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

    orderItem.productModel = productModel;
    

    如您所见,这非常简单直接 . 您的部分困惑来自旧的数据库 - 思考左连接心态 . 如果您的具体订单商品属于某个产品型号,则该关系应称为“productModel”,而不是“itemToProd” . 尽可能保持简单的英语 .

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

    entity.property = number;
    

    entity.property = [NSNumber numberWithInteger:[number integerValue]];
    
  • 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 链接 OrderItemProduct . OrderItem.product 属性直接指向 Product 对象 .

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

    [context save];
    

    要获取产品的所有OrderItem的列表,只需使用 prodA.orderItems ,它返回OrderItems的NSSet .

相关问题