2013-12-16 157 views
0

我有我的核心數據設置爲這樣:核心數據添加新的NSManagedObject

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拉出產品,然後將它們添加到新PA中?該過程是否類似於CUSTOMERSALES_REP實體?

回答

1

我想第一個問題是爲什麼麻煩有一個workingPA,爲什麼不直接讓他們編輯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! 
    } 
+0

感謝鄧肯,我得與昨天我自己的回答相同的點,只是需要更清楚地思考。我們有一個工作PA的原因是因爲如果PA進入最終狀態,我們不希望用戶更改該數據,但他們可能想將其用作新PA的起點,所以我們製作一個新PA實體並傳輸數據並更改其狀態,所以如下所示:if(PA status == 4)then workingPA = copy else workingPA = PA ... do stuff – PruitIgoe