2013-02-19 292 views
3

我有一個與核心數據相關的問題以及在爲某個實體創建NSManagedObject子類時自動創建的刪除對象函數。 我必須要實體;一個叫Label,有一個關係叫藝術家,另一個叫藝術家,有一個叫label的關係。藝術家關係目標是具有設置爲標籤的反比關係的實體藝術家。核心數據刪除對象函數

我添加了一些「藝術家」具有相同的名稱(弗裏基·澤基),我嘗試使用下一個代碼

NSError *error = nil; 
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; 

// Grab the artist and delete 
Artist *freekey = [fetchedObjects objectAtIndex:0]; 
[freekey.label remove ArtistsObject:freekey]; 


// Save everything 
if([context save:&error]) 
{ 
    NSLog(@"The save was successful!"); 
} 
else 
{ 
    NSLog(@"The save wasn't successful: %@", [error localizedDescription]); 
} 

執行此代碼後刪除它們,我讀出的數據,但當我只有一個「Freekey Zekey」時,藝術家纔會被刪除。但是,當我再次運行應用程序時,fetchedObjects中的對象數量仍然是一個。如果我有一個以上的「Freekey Zekey」,我希望只有一個被刪除,但不會發生。

我嘗試使用此代碼刪除所有「弗裏基·澤基」

for(int i=0; i < [fetchedObjects count]; i++) 
{ 
    freekey = [fetchedObjects objectAtIndex:i]; 

    [freekey.label remove ArtistsObject:freekey]; 
} 

和它的作品,但是當我檢查對象的號碼fetchedObjects它不是0,我相信,是指物體避風港」沒有被刪除。

我該如何徹底刪除一個對象?

回答

3

答案是:您不會從數據庫中完全刪除藝術家。你只是刪除關係,並完成刪除,你也需要刪除藝術家。

for(int i=0; i < [fetchedObjects count]; i++) 
{ 
    freekey = [fetchedObjects objectAtIndex:i]; 
    [freekey.label removeArtistsObject:freekey]; 
    [context deleteObject:freekey]; 
} 
if([context save:&error]) 
{ 
    NSLog(@"The save was successful!"); 
} 
else 
{ 
    NSLog(@"The save wasn't successful: %@", [error localizedDescription]); 
} 

希望它有幫助。

+2

如果您將「標籤」關係的「刪除規則」設置爲「Nullify」,那麼您只需刪除Artists對象,它將自動從標籤中刪除。 – 2013-02-19 07:55:04

+0

是的,這在很多常見的情況下都適用。但我更喜歡明確刪除關係,而不是等待CoreData處理其更改。我的意見更安全。思考。 – 2013-02-19 08:15:53

+0

謝謝你的回覆。 您的代碼完美工作,我能夠更好地理解我應該如何從Core Data中移除對象。 – 2013-02-20 16:16:04

2

蘋果文檔在這方面並不十分清楚。一般的方法是蘋果建議:

Data *lastData = [[self sortedPersonDatas] objectAtIndex:0]; 
[selectedPerson removePersonDataObject:lastData]; 

其中PersonData是一個一對多的關係,數據管理對象從我拍攝的最後數據(lastData導致所有數據的有序數組) 但使用工廠移除方法並檢查後面的SQL數據庫,我們可以發現實際的數據存在正好相反的關係爲空。要完全刪除必須使用的數據(所有屬性和對象):

[selectedPerson.managedObjectContext deleteObject:lastData]; 

這將在保存上下文時完全刪除記錄。 正確的文檔from Apple