删除CoreData对象会导致FetchedResultsController错误

时间:2017-01-17 22:31:23

标签: ios core-data nsfetchedresultscontroller

我正在使用Big Nerd Ranch BNRCoreDataStack,但我怀疑如果我使用标准CoreData,这个问题就会存在。

我有一个FetchedResultsController来通过获取NSManagedObjects来填充我的表。它们以节和行的形式呈现。我的问题是,当我在其他地方删除NSManagedObjects时,我从FetchedResultsController收到错误:

[error] error: Serious application error.  An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:.  attempt to insert row 0 into section 1, but there are only 1 sections after the update with userInfo (null)

之后,我的单元格在表格中可见,当我点击其中时,我收到此错误:

fatal error: Index out of range

因此,这告诉我,当我删除CoreData对象时,FetchedResultsController无法从我的表中删除单元格。

奇怪的是,我正在viewWillAppear重新加载表格数据,所以我认为这样可以清除表格。如何强制FetchedResultsController转储所有数据知识并从头开始?

1 个答案:

答案 0 :(得分:0)

我明白了。我的托管对象是Note类。这是:

@objc(Note)
class Note: NSManagedObject {

    @nonobjc override class func fetchRequest() -> NSFetchRequest{
        return NSFetchRequest(entityName: "Note");
    }

    @NSManaged var title: String?
    @NSManaged var body: String?
    @NSManaged var day: CalendarDay?
    @NSManaged var timestamp: NSDate?
}

extension Note: CoreDataModelable {

    static var entityName: String {

        return "Note"
    }

    var sectionTitle:String {

        willAccessValueForKey("day")
        defer { didAccessValueForKey("day") }

        if day != nil {

            return day!.timestampString!

        }else{
            return "___"
        }
    }
}

注意我有一个名为sectionTitle的额外变量?好吧,我的FetchedResultsController使用它作为Section分类键。当它试图访问已被删除的Day对象时发生了异常。

这里学到的教训不是尝试将这样的变量添加到托管对象类中,而是确保您拥有可用于排序的实体的托管属性。这是有充分理由的。