2017-05-30 173 views
0

我試圖複製一個NSManagedObject,它包含一個核心數據實例,但是我這樣做時會出現一些非常奇怪的行爲,就像這些對象在複製之後以某種方式鏈接到對方,並且更改爲另一個也會影響另一個。不可能複製核心數據NSManagedObject?

NSManagedObject *originalTransactionRow = [self.transactionRowsRows objectAtIndex:indexPath.row]; 
NSManagedObject *originalTransactionHeader = [self.transactionRowsHeader objectAtIndex:0]; 
NSString *originalOrderNumberLocalStr = [originalTransactionRow valueForKey:@"orderNumber"]; 

NSString *returnOrderNumber = [NWTillHelper getNewOrderNumber]; 
NSManagedObject *returnOrderHeader = nil; 
NSManagedObject *returnOrderRow = nil; 

returnOrderHeader = [NSEntityDescription insertNewObjectForEntityForName:@"OrderHead" inManagedObjectContext:context]; 
returnOrderRow = [NSEntityDescription insertNewObjectForEntityForName:@"OrderRow" inManagedObjectContext:context]; 

returnOrderHeader = originalTransactionHeader; 
returnOrderRow = originalTransactionRow; 

NSError *error = nil; 
if(![context save:&error]) { 
    if([NWTillHelper isDebug] == 1) { 
    NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]); 
    return; 
    } 
} 
+0

關於這個問題的很多實驗可以在這裏找到:https://stackoverflow.com/questions/2730832/how-can-i-duplicate-or-copy-a-core-data-managed-object – danh

回答

1

如果你指的這些行:

returnOrderHeader = originalTransactionHeader; 
returnOrderRow = originalTransactionRow; 

那些不進行復印。但它不是關於核心數據或託管對象的 - 當您詳細介紹對象引用時,Objective-C不是如何工作的。當您有像NSManagedObject *returnOrderHeader這樣的聲明時,*意味着您要保存一個指向該對象的指針。複製指針值不復制對象數據,它複製指針值。你最終得到兩個具有相同指針的變量,這意味着它們確實是同一個對象。

如果您想製作一個對象的副本,則需要執行額外的步驟。如果你的對象的類符合NSCopying協議,那麼你可以在對象上調用copy。但是託管對象不這樣做,因此您需要創建一個新實例,然後編寫自己的代碼以將舊實例的屬性值複製到新實例。

+0

得到它可以解釋這些問題,所以基本上我需要創建一個新的空的ManagedObject,然後根據舊對象逐個設置值並將該新對象保存到上下文中。 –

+0

沒錯。任何關係也需要重新創建。 –

相關問題