我正在使用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
转储所有数据知识并从头开始?
答案 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
对象时发生了异常。
这里学到的教训不是尝试将这样的变量添加到托管对象类中,而是确保您拥有可用于排序的实体的托管属性。这是有充分理由的。