2011-06-13 160 views
3

我有一個使用coredata的項目,我正試圖從我存儲的內容中刪除。但我不斷收到這個錯誤。刪除對象Coredata

An NSManagedObjectContext cannot delete objects in other contexts. 

我看着蘋果公司不得不說,從我可以告訴我有它正確的,但事情仍然關閉。有什麼建議麼?謝謝!

for (UserNumber *info in pinNumberArray) { 

     NSSet *time = [[NSSet alloc] initWithSet:info.Times]; 

     for (ErgTimes *ergTimes in time){ 

      NSMutableArray *temp = [[NSMutableArray alloc] initWithObjects:ergTimes.Twok, nil]; 
      NSManagedObject *eventToDelete = [temp objectAtIndex:0]; 
      [managedObjectContext deleteObject:eventToDelete]; 
     } 
    } 

回答

11

嗯,這可能是你的對象,上下文和線程混淆了。 NSManagedObjectContext不是線程安全的。要從上下文中刪除一個對象,你需要首先將對象「提取」到上下文中,我猜你的被管理對象是由不同的MOC提取的。沒有看到更多的代碼,我不知道。

但是,有一個相對簡單的修復方法。在你的for循環中,做這件事而不是

for (ErgTimes *ergTimes in time){ 
    NSMutableArray *temp = [[NSMutableArray alloc] initWithObjects:ergTimes.Twok, nil]; 
    NSManagedObject *eventToDelete = [managedObjectContext objectWithID:[[temp objectAtIndex:0] objectID]]; 
    [managedObjectContext deleteObject:eventToDelete]; 
} 

這是做什麼是獲取目前使用其對象,它是線程安全的MOC中的對象。

+0

當我嘗試,我得到以下錯誤 - [NSCFNumber objectID]:無法識別的選擇發送到實例0xaa004f0。有什麼想法嗎? – 2011-06-13 21:36:51

+0

哦,我不確定你的數組是什麼,假設它是一個NSManagedObject(或子類)。您需要從您的NSManagedObject獲取對象ID,並將其作爲參數傳遞給MOC,它將返回相同的受管對象,但在當前上下文中,然後可以刪除它們。從你原來的問題來看,什麼是ErgTimes類,它是Twok屬性? – 2011-06-14 00:28:48

+1

哦,對不起,你只需要調用[managedObjectContext deleteObject:[managedObjectContext objectWithID:[info objectID]]]; – 2011-06-14 00:32:25

0

您必須使用相同的NSManagedObjectContext您用於獲取要刪除它們的對象。最簡單的解決方案:使用與每個對象關聯的managedObjectContext來刪除它。像這樣:

for (UserNumber *info in pinNumberArray) { 

    NSSet *time = [[NSSet alloc] initWithSet:info.Times]; 

    for (ErgTimes *ergTimes in time){ 

     NSMutableArray *temp = [[NSMutableArray alloc] initWithObjects:ergTimes.Twok, nil]; 
     NSManagedObject *eventToDelete = [temp objectAtIndex:0]; 
     [eventToDelete.managedObjectContext deleteObject:eventToDelete]; 
    } 
} 
+0

這是我如何獲取對象,你能看到這個問題嗎? NSEntityDescription * entity = [NSEntityDescription entityForName:@「UserNumber」inManagedObjectContext:managedObjectContext]; NSFetchRequest * request = [[NSFetchRequest alloc] init]; [request setEntity:entity]; NSSortDescriptor * pinNumbers = [[NSSortDescriptor alloc] initWithKey:@「PIN」升序:NO]; NSArray * sortDescriptors = [NSArray arrayWithObject:pinNumbers]; [request setSortDescriptors:sortDescriptors]; NSMutableArray * mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; – 2011-06-13 23:09:13