一千萬個為什麽

搜索

如何從上下文中刪除非提交的對象?

我在應用程序中使用核心數據和NSFetchedResultsController,用於為UIViewTable提供Car對象。我有一個按鈕,當用戶可以添加新車時,在選項卡上將應用程序帶到另一個視圖。我遇到的問題是即使用戶沒有在第二個視圖中創建汽車,它也會被添加到表中。如果我重新啟動應用程序,則Car未添加到數據庫中。

這與我在viewDidLoad方法的第二個視圖中使用以下內容創建Car實例有關:

    car = [NSEntityDescription insertNewObjectForEntityForName:@"Car" 
                                  inManagedObjectContext:context];

即使我不保存上下文,也會添加此內容。

我試圖在第二個視圖即將關閉時刪除該對象,使用:

[context deleteObject:car];

這部分有效。汽車沒有添加到第一頁的表中,但看起來像數據源的索引被更改。如果我一直向下滾動,我得到了這個錯誤:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[_PFBatchFaultingArray objectAtIndex:]: index (9) beyond bounds (9)'

任何想法將不勝感激。

最佳答案

嘗試通過傳遞 nil 上下文來創建汽車對象:

car = [NSEntityDescription insertNewObjectForEntityForName:@"Car" 
                              inManagedObjectContext:nil];

從那裏,如果用戶決定保存它,您可以將對象移動到主上下文。

另一種方法是為此視圖設置單獨的MOC(這會增加不必要的復雜性),然後在需要時再次在上下文之間移動對象。

幹杯,

ROG

PS:如果您想知道是否可以將nil作為managedObjectContext傳遞,這可以直接來自Apple在NSManagedObject上的文檔:

...如果上下文不是nil,這個方法   調用[context insertObject:self]   (這會導致awakeFromInsert   調用)...

More details here

[編輯] </強>

除此之外,我在查看NSFetchRequest文檔時發現了一些有趣的東西,並認為你可能想要去(我還沒有嘗試過)。在獲取對象時,您似乎可以告訴fetchRequest是否包含掛起的更改(即未保存):

- (void)setIncludesPendingChanges:(BOOL)yesNo

FYI the default value is YES - more details here

轉載註明原文: 如何從上下文中刪除非提交的對象?