我有一个非常简单的UITableView
,使用NSFetchedResultsController
加载核心数据记录。我已经将Objective-C代码重写为Swift。在iOS 7模拟器上运行Swift代码时似乎有问题,但在iOS 8上运行正常。据我所知,Swift应该向后兼容iOS 7。
运行iOS 7而不是8时出现的错误是:
由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'NSFetchRequest无法找到实体名称的'NSEntityDescription'类别''
由于某些原因,在执行NSFetchRequest
时,它不喜欢我在iOS 7上的核心数据实体Category
,但在iOS 8上没问题,有什么想法吗?
class CategoriesListTableViewController : CoreDataTableViewController, AddEditCategoryTableViewControllerDelegate {
let kCategoryEntityID = "Category"
let kCategoryCellID = "Category Cell"
let kCategoryEntityParentAttributeID = "parent"
let kCategoryEntityNameAttributeID = "name"
let kCategoriesCacheID = "Categories"
let kAddCategorySegue = "Add Category"
let kEditCategorySegue = "Edit Category"
var moc = NSManagedObjectContext()
override func viewDidLoad() {
super.viewDidLoad()
let app = UIApplication.sharedApplication().delegate as AppDelegate
moc = app.cdh().context
//debugcode
let mom = moc.persistentStoreCoordinator.managedObjectModel
let entities = mom.entitiesByName
let entityNames = entities.description
println("All loaded entities are: \(entityNames)")
self.setupFetchedResultsController()
}
func setupFetchedResultsController() // attaches an NSFetchRequest to this UITableViewController
{
let request = NSFetchRequest(entityName: kCategoryEntityID)
let sortParent = NSSortDescriptor(key: kCategoryEntityParentAttributeID, ascending: true)
let sortName = NSSortDescriptor(key: kCategoryEntityNameAttributeID, ascending: true)
let sortDescriptors = [sortParent, sortName]
request.sortDescriptors = sortDescriptors
self.fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: moc, sectionNameKeyPath: kCategoryEntityParentAttributeID, cacheName: kCategoriesCacheID)
}
答案 0 :(得分:0)
您似乎无法正确创建托管对象上下文。使用实体名称字符串创建的提取请求在与实际的托管对象上下文关联之前不是“完整的”。托管对象上下文又将其与包含必要实体描述的托管对象模型相关联。
在这种情况下,这应该在获取结果控制器的初始化期间发生。在创建FRC时,检查是否按预期加载了正确的托管对象上下文。
由于您的不同结果分别出现在iOS7和8中,请考虑先从模拟器中完全删除应用程序。此外,尝试在再次构建之前清理项目。