2011-12-30 63 views
2

我在NSManagedObject上有一個子類say Business。我有一些存儲在Core Data中的商業。 現在我獲取所有從核心數據的企業通過複製核心數據對象

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Business" inManagedObjectContext:[Model sharedInstance].managedObjectContext]; 
[fetchRequest setEntity:entity]; 

NSError* error = nil; 
NSMutableArray * businesses = (NSMutableArray*)[self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
[fetchRequest release]; 

如果我希望有任何一個副本,一個業務對象,我做的:

Business *tempBusiness = [[businesses objectAtIndex:0] mutableCopy]; 

在這一點上,我得到一個錯誤 「[Business copyWithZone]無法識別的選擇器」

爲什麼我得到這個錯誤。或者有沒有辦法創建一個核心數據對象的可變副本?

+0

[如何在覈心數據中對NSManagedObject進行深度複製](http://stackoverflow.com/questions/3800007/how-to-make-deep-copy-of-nsmanagedobject-in-core-data ) – Eimantas 2011-12-30 12:03:09

回答

3

第一核心數據沒有可變和不可變對象的概念。您可以隨時更改對象(在數據模型的約束範圍內)。

其次我們需要區分的內存副本和數據庫中的副本。內存拷貝本質上會執行從內存地址A到內存地址B的memncpy字節。這實質上就是Objective-C中爲我們提供的copymutableCopy。數據庫中的副本將創建現有行的副本。這些類型的副本之間的重要區別在於,第一個副本不會在數據庫中創建副本。

總之,你不能在NSManagedObjects的內存副本。一個NSManagedObject(本例中爲Business)是數據庫中的一行。因此,如果copymutableCopyNSManagedObjects進行了處理,它將創建多個對象,它們引用的數據庫中的同一行來自相同的NSManagedObjectContext。這並沒有多大意義,並會產生比解決問題更多的問題。例如,如果您有兩個NSManagedObject副本,並且第一個名稱更改爲@"Bar",第二個更改名稱爲@"Foo"。然後撥打save您的NSManagedObjectContext哪些值寫入@"Foo"@"Bar"

爲了在數據庫中創建副本,您需要創建一個新的Business實例並複製所有屬性和關係並保存新對象。