2013-09-28 168 views
1

我有一個UItableView,我在其中顯示項目列表。您可以選擇和取消選擇這個項目列表。CoreData對象不會被刪除

當用戶選擇從tableview中的項目,然後我再補充一點字典我coredata當用戶取消選擇從tableview中的項目,然後我刪除我的coredata該字典

每一件事情在這方面工作正常,因爲我在每次選擇和取消選擇日誌coredata對象,所以我可以看到有1 2或3項depeneing如果我選擇了他們,然後如果我取消選擇說第3項它只記錄1和2.

所以我知道這些功能工作正常。現在接下來我已經實現了哪些是錯誤的是當tableview顯示時,我檢查是否有任何來自我的coredata的項目,然後當我找到與當前單元格有關的項目時,我添加了一個配件勾號。這是爲了顯示已經將哪些值保存到核心數據。

現在奇怪的是,以前我從coredata中刪除了第3項,並通過讀取coredata值並確認只有1 & 2存在。然後重新構建應用程序以檢查並確保該功能正常工作,在視圖加載時分配滴答。一旦視圖加載項目1 2和3都被再次選中.....即使3不應該。

我不知道我做錯了,但是這是我的coredata刪除功能多數民衆贊成呼籲取消

// Deleting values/tables from coredata entity 
- (void)deleteSingleObject:(NSString *)entityDescription Dictionary:(NSDictionary *)dictionary { 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityDescription inManagedObjectContext:__managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    NSString *projectIDString = [dictionary objectForKey:@"ProjectID"]; 
    NSPredicate *p=[NSPredicate predicateWithFormat:@"projectID == %@",projectIDString]; 
    [fetchRequest setPredicate:p]; 


    NSError *error; 
    NSArray *items = [__managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

    for (NSManagedObject *product in items) { 
     [__managedObjectContext deleteObject:product]; 
    } 

} 

,這是我怎麼分配蜱當視圖加載

// check if cell needs accessorytick 
    for (int i = 0; i < [projectListReadFromCoreDataMutableArray count]; i++) { 
     NSDictionary *tempReadCoreDataDictionary = [projectListReadFromCoreDataMutableArray objectAtIndex:i]; 
     if ([[tempReadCoreDataDictionary objectForKey:@"ProjectID"] isEqualToString:[projectDictionary objectForKey:@"ProjectID"]]) { 
      projectListCustomCell.accessoryType = UITableViewCellAccessoryCheckmark; 
     } 
    } 

任何幫助將不勝感激。 如果你需要更多的信息或代碼讓我知道,但這些是我認爲這是不工作的原因的兩個核心部分。

回答

4

您正在從託管對象上下文中刪除對象,但永遠不會將此類修改保存到持久性存儲中。

引述documentation

就像一個新的對象沒有被保存到店,直到上下文被保存,刪除的對象不是從商店刪除,直到上下文保存

這就是重新加載應用程序時對象再次出現的原因。

你必須在MOC保存到持久性存儲,使永久刪除,即像

NSError *error = nil; 
if (![_managedObjectContext save:&error]) { 
    // handle error  
} 
+0

哦..人這個工作完美。我在前面的某個地方查看了代碼,但是因爲我認爲這只是爲了捕獲錯誤.. whoopsie ..感謝您的幫助,它完美運行。一旦時間到了,我會接受你的回答:) – HurkNburkS

+0

@HurkNburkS我很高興你解決了這個問題。無論如何,你應該繼續閱讀我鏈接的文檔,以更好地理解Core Data的結構。 –