为啥 Xcode 无法识别我的核心数据实体的属性

Posted

技术标签:

【中文标题】为啥 Xcode 无法识别我的核心数据实体的属性【英文标题】:Why is Xcode not recognizing the attributes of my core data entity为什么 Xcode 无法识别我的核心数据实体的属性 【发布时间】:2015-07-25 00:03:31 【问题描述】:

有人知道为什么 Xcode 无法识别我为实体设置的属性吗?

在这段代码中,“authors”属性可以正常工作:

func createBook() 
        let entityDescription = NSEntityDescription.entityForName("Books", inManagedObjectContext: managedObjectContext!)
        let book = Books(entity: entityDescription!, insertIntoManagedObjectContext: managedObjectContext)
        book.name = bookName.text
        book.author = authorField.text
        managedObjectContext?.save(nil)
    

然而,在我的 TableViewController 的一个函数中,它说“书”没有属性“作者”:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
        let book: AnyObject = newBookViewController.fetchedResultsController.objectAtIndexPath(indexPath)
        cell.textLabel?.text = book.name
        cell.detailTextLabel?.text = book.author
        return cell

此外,当我在实体检查器中向我的 Books 实体添加更多属性时,即使是第一个函数也无法识别它们。另外,这是一次保存多个属性的正确方法吗?

func bookFetchRequest() -> NSFetchRequest 
        let fetchRequest = NSFetchRequest(entityName: "Books")
        let nameSortDescriptor = NSSortDescriptor(key: "name", ascending: true)
        let authorSortDescriptor = NSSortDescriptor(key: "author", ascending: true)
        fetchRequest.sortDescriptors = [nameSortDescriptor]
        fetchRequest.sortDescriptors = [authorSortDescriptor]
        return fetchRequest
    

【问题讨论】:

【参考方案1】:

    为了让编译器知道你的书有作者,它必须知道它是一本书。

    let book: AnyObject = newBookViewController.fetchedResultsController.objectAtIndexPath(indexPath)
    

    将 book 声明为 AnyObject,这是 objectAtIndexPath 默认返回的。既然你知道这是一本书,你可以像这样将它投射成一本书:

    let book = newBookViewController.fetchedResultsController.objectAtIndexPath(indexPath) as! Books
    

    不幸的是,在身份检查器中添加属性不会自动将它们添加到现有的 NSManagedObject。假设您创建了没有流派字段的 Books 模型,并且您想稍后添加它,您将在身份检查器中添加它,然后添加

    @NSManaged var genre: String
    

    到 Books 类。

    如果你想在一个获取请求上使用多个排序描述符(例如,首先按作者排序,对于同一作者的书籍,按名称排序),那么你会这样做

    fetchRequest.sortDescriptors = [authorSortDescriptor, nameSortDescriptor]
    

【讨论】:

我想我已经通过将实体描述设置为 Books 来告诉编译器它正在处理一本书。如果属性没有自动添加到 NSManagedObject,为什么在我的代码中无需将其声明为变量而添加了“名称”,而其他的不会这样做? 是的,获取请求确实有实体描述,但无论出于何种原因,objectAtIndexPath“忘记”了这一点,并且默认情况下总是返回 AnyObject。您是否尝试过投射它,成功了吗? 嗯,当您第一次从身份检查器创建 NSManagedObject 时,它通常会获取您设置的任何属性并将它们转换为 NSManaged var 实例变量。但是,如果您随后添加更多属性,则必须自己添加实例变量。如果您看到不同的东西,我不知道为什么 所以我实际上能够通过添加变量并重新安装应用程序来让“作者”工作。但是,现在一个新属性 numberOfPages 给了我同样的错误,我已经尝试了所有相同的东西。我不关心保存存储在模拟器中的数据,所以用一个新的数据模型创建一个新项目,我的所有属性都已经设置并复制到我的代码中是个好主意吗?我已经尝试创建一个新实体来替换我的旧实体并卸载我当前项目中的应用程序,但这不起作用。 如果它适用于作者,我不知道为什么它不适用于 numberOfPages。您真的不应该仅仅为了添加到数据模型而启动一个新项目,通常卸载应用程序并在数据模型更改后重新运行它就足够了。抱歉,不知道为什么它不起作用

以上是关于为啥 Xcode 无法识别我的核心数据实体的属性的主要内容,如果未能解决你的问题,请参考以下文章

向核心数据实体添加属性

为啥 Xcode 会为我的模型类的布尔属性生成 NSNumber 属性?

如何让用户在核心数据xcode中创建自己的属性

Xcode4 数据实体建模问题 - 属性的 userInfo 为零

为啥我不能使用“描述”作为核心数据实体的属性名称?

为啥向核心数据实体添加双重属性会导致远距离相关实体中的属性冲突出现 NSInternalInconsistencyException?