Swift 核心数据问题

Posted

技术标签:

【中文标题】Swift 核心数据问题【英文标题】:Swift Core Data Issue 【发布时间】:2014-08-10 09:45:57 【问题描述】:

我有一个非常简单的UITableView,它使用NSFetchedResultsController 加载核心数据记录。我已经将 Objective-C 代码重写为 Swift。在 ios 7 模拟器上运行 Swift 代码时我似乎遇到了问题,但在 iOS 8 上还可以。据我所知,Swift 应该向后兼容 iOS 7。

我在运行 iOS 7 而不是 8 时遇到的错误是:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“NSFetchRequest 无法找到实体名称“Category”的 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)
    

【问题讨论】:

【参考方案1】:

看来您可能没有正确创建托管对象上下文。使用实体名称字符串创建的获取请求在与实际托管对象上下文相关联之前不是“完整的”。托管对象上下文又将其与包含必要实体描述的托管对象模型相关联。

在这种情况下,这应该在获取结果控制器的初始化期间发生。检查创建 FRC 时是否按预期加载了正确的托管对象上下文。

由于您的不同结果分别出现在 iOS7 和 8 中,请考虑先从模拟器中完全删除应用程序。此外,在再次构建之前尝试清理项目。

【讨论】:

以上是关于Swift 核心数据问题的主要内容,如果未能解决你的问题,请参考以下文章

核心数据检查是不是已经保存,Swift

Swift 3 核心数据问题 - 所有数据丢失

Swift 3 核心数据获取问题

Swift 核心数据 FetchRequest NSData 到 UIIMage

排序核心数据获取(swift 4)

带有扩展的 Swift 核心数据