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

时间:2014-08-09 18:25:51

标签: ios cocoa-touch core-data swift

核心数据存在奇怪问题......

我有一个模型,我将其他几个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上运行但在设备上没有,可能是其他错误(可能是数据模型文件?)。但是实体命名在任何地方都是正确的,我在数据模型中将实体类作为项目模块名称的前缀。

6 个答案:

答案 0 :(得分:8)

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

@objc(Book)
class Book: NSManagedObject {

    @NSManaged var ...

}

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

答案 1 :(得分:3)

确保在数据模型检查器标签中的架构文件中,将类设置为{AppName}.Book.

答案 2 :(得分:1)

我弄清楚出了什么问题:datamodel文件已损坏。我删除了旧的,并从头开始重新创建它,听到听到,它现在有效。当我设置一个新项目并复制文件时,它必定发生,因为我在其间重命名了项目。因此,复制数据模型文件显然搞砸了它。

答案 3 :(得分:0)

您应该将类​​设置为{AppName}.Book.在架构文件的数据模型中

答案 4 :(得分:0)

一个不同的解决方案对我有用:当我将NSManagedObject子类创建为Swift类时,我得到了这个错误,但是当我指定一个Objective-C类(并将其包含在我的桥接头中)时却没有。

答案 5 :(得分:0)

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