核心数据:“无法在此模型中找到名为 ... 的实体”(仅在设备上)

Posted

技术标签:

【中文标题】核心数据:“无法在此模型中找到名为 ... 的实体”(仅在设备上)【英文标题】:Core Data: "could not locate an entity named ... in this model" (Only on device) 【发布时间】:2014-08-09 18:25:51 【问题描述】:

Core Data 有一个奇怪的问题...

我有一个模型,我将其他几个 NSManagedObjects 设置为另一个 NSManagedObject(To One 关系)的一部分。它在模拟器中运行良好,但是当我在设备上测试时它崩溃了,给我这个错误:

2014-08-10 03:14:13.292 Prologue[4099:60b] * 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“+entityForName:无法在此找到名为“BookContents”的实体模型。' * 首先抛出调用栈: (0x184ad3100 0x1914b01fc 0x1847f2f84 0x1000794ec 0x10007846c 0x100068250 0x10006adf0 0x10006ae54 0x187ad10b0 0x187ad1044 0x187aba520 0x187ad0a44 0x187ad06d8 0x187acb370 0x187a9cb50 0x187a9ac40 0x184a937f4 0x184a92b50 0x184a90de8 0x1849d1dd0 0x18a671c0c 0x187b02fc4 0x100072fd4 0x100073014 0x191aa3aa0) libc++abi.dylib:以 NSException 类型的未捕获异常终止

BookContents 是一个与我的主要数据模型对象 Book 相关的模型。这是创建它的代码:

func createBookModel() -> Book

    var book:Book = createFromEntity("Book") as Book;
    if (book != nil)
    
        book.title = "New Book";
        book.bookContents = createFromEntity("BookContents") as BookContents;
        saveContext();
    
    else
    
        Log.error("Failed to create Book.");
    
    return book;


func createFromEntity(entityName:String) -> NSManagedObject

    var obj:NSManagedObject = NSEntityDescription.insertNewObjectForEntityForName(entityName, inManagedObjectContext: moc) as NSManagedObject;
    return obj;

我不确定这里出了什么问题,但由于它在 emu 上运行而不是在设备上运行,因此可能是其他问题(可能与数据模型文件有关?)。但是实体命名在任何地方都是正确的,我在数据模型中的实体类前面加上项目的模块名称。

【问题讨论】:

自从您将应用程序放到您的设备上后,您是否更改了您的模型? 【参考方案1】:

我们在为数据模型中的实体类使用项目的模块名称前缀时遇到了问题。相反,我们为 NSManagedObjects 生成的类添加了 @objc(ClassName)。

@objc(Book)
class Book: NSManagedObject 

    @NSManaged var ...


如果不能解决您的问题,您可以尝试删除前缀并添加 @objc(ClassName)。

【讨论】:

感谢您的提示,但它并没有为我解决问题。和以前一样的错误。如果我注释掉它设置 book.bookContents 的行并将该关系设置为可选,它就可以工作。但是当我尝试设置 book.bookContents 时它会崩溃。 实际上,这是目前使用 Xcode 6 beta 的一个很好的解决方法。因为如果您将 AppName 设置为 Schema 中的前缀,然后决定使用 Xcode 重新创建所有类文件,它将创建一个以 AppName 命名的文件。 Xcode 6 Beta 中的可怕错误! @Avalon 确保你在上面提交雷达。【参考方案2】:

确保在数据模型检查器选项卡中的架构文件中将 Class 设置为 AppName.Book.

【讨论】:

如上所述,模块名称前缀已在架构中正确设置。它没有帮助。【参考方案3】:

我发现出了什么问题:数据模型文件已损坏。我已经删除了旧的并从头开始重新创建它,听说,它现在可以工作了。当我建立一个新项目并复制文件时一定会发生这种情况,因为我在两者之间重命名了项目。所以复制数据模型文件显然搞砸了。

【讨论】:

【参考方案4】:

你应该在Schema文件的数据模型中设置类为AppName.Book.

【讨论】:

【参考方案5】:

另一种解决方案对我有用:当我将 NSManagedObject 子类创建为 Swift 类时出现此错误,但在我指定 Objective-C 类(并将其包含在我的桥接头中)时却没有。

【讨论】:

【参考方案6】:

检查拼写。我的问题是我的实体名称是大写的并且我已经降低了它。这些很难捕捉。

【讨论】:

以上是关于核心数据:“无法在此模型中找到名为 ... 的实体”(仅在设备上)的主要内容,如果未能解决你的问题,请参考以下文章

哪里不使用核心数据?是不是可以将核心数据用作 MySql 之类的数据库?

使用 MKMapView、核心位置和核心数据

大数据三大核心技术:拿数据、算数据、卖数据!

核心数据道模式

通过迁移将核心数据实体及其数据移动到新的核心数据模型文件中

核心数据与用于核心数据的单个 MOC 和主线程合并冲突