核心数据添加新的NSManagedObject

时间:2013-12-16 16:02:35

标签: objective-c core-data

我的核心数据设置如下:

SALES_REP< --->> CUSTOMER< ---->> PURCHASE_AGREEMENT<< ------->> PRODUCTS

在应用程序中,销售代表可以更改PRODUCTS实体的属性,这会触发对PURCHASE_AGREEMENT的更改。当他们完成编辑工作PA时,他们可以通过Web服务提交到我们的CRM(SAP)或在本地保存他们的工作。

我理解(至少我认为我这样做:D)如何创建新的NSManagedObject并为其添加值的属性:

NSManagedObject* newManagedObject = [NSEntityDescription insertNewObjectForEntityForName:@"PA" inManagedObjectContext:self.moc];

//get the entity descriptions for PA, Customer, PA_Products and Sales_Rep
NSEntityDescription* PAEntity = [NSEntityDescription entityForName:@"PA" inManagedObjectContext:self.moc];
NSDictionary* dictPAAttributes = [PAEntity attributesByName];
NSArray* arrPAAttributeNames = [dictPAAttributes allKeys];

for(NSString* strThisAttribute in arrPAAttributeNames) {
    [newManagedObject setValue:[self.workingPA valueForKey:strThisAttribute] forKey:strThisAttribute];
}

我如何添加关系?我是否必须获取新创建的PA实体,然后提取产品,从工作PA中提取NSSet个产品,然后将它们添加到新的PA中?并且CUSTOMERSALES_REP实体的流程是否相似?

1 个答案:

答案 0 :(得分:1)

我想第一个问题是为什么要麻烦有一个workPA,为什么不让他们直接编辑newManagedObject。然后你只需要拨打[moc save]

但要创建创建新关系所需的关系,因为旧的关系位于workingPA对象和其他对象之间。

帮自己一个忙,从creating NSManagedObject subclasses开始

PurchaseAgreement 
Customer
Product

然后假设您拥有它们,您可能还需要创建另一个名为PAItem的对象来跟踪与PA关联的项目的详细信息(数量,成本等)

所以假设你有这个然后将项目添加到PA你会做这样的事情:

  PurchaseAgreement * newPA = [NSEntityDescription
                               insertNewObjectForEntityForName:@"PurchaseAgreement"
                               inManagedObjectContext:_managedObjectContext];

  newPA.customer = workingPA.customer;
  newPA.attribute1 = workingPA.attribute1;

  for (PAItem *item in workingPA.items) {

     PAItem * newItem = [NSEntityDescription
                               insertNewObjectForEntityForName:@"PAItem"
                               inManagedObjectContext:_managedObjectContext];
     newItem.purchaseAgreement = savingPA;
     newItem.product = item.product;
     newItem.quantity = item.quantity;
     newItem.cost = item.cost;
     . . .

  }
  NSError *error = nil;
  if (![_managedObjectContext save:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    // Take some action!
  }