核心数据:错误,"无法合并具有两个不同实体的模型命名为'foo'"

Sea*_*ome 30 database iphone core-data file

我正在开发一款使用Core Data的iPhone应用程序.大多数情况下,我只是在模拟器中测试,但偶尔会将应用程序下载到iPad以确保.

我最近改变了我的核心数据模型,现在当我将应用程序发送到iPad时,我收到一个SIGABRT异常告诉我:

 Can't merge models with two different entities named 'foo'
Run Code Online (Sandbox Code Playgroud)

好的,我理解.设备上存在旧版本的数据库.所以,我(尝试)通过按住应用程序的图标来杀死旧版本,直到它开始摆动,然后点击它的"X".iPad询问我是否要删除应用程序及其所有数据.我说是.

我重建应用程序,针对iPad,并得到相同的错误.

让旧数据库真正消失是否有诀窍?

ben*_*ioT 61

对于那些在尝试使用核心数据轻量级迁移后遇到此问题的人:

即使遵循了创建新版本数据模型的说明,我也遇到了这个问题.我注意到我的应用程序包中有两个".mom"文件,一个".mom"和一个".momd"目录,其中包含".mom"文件.

关键是- (NSManagedObjectModel *)managedObjectModel要用这个实现替换为你生成的实现:

- (NSManagedObjectModel *)managedObjectModel {

    if (managedObjectModel != nil) {
        return managedObjectModel;
    }

    NSString *path = [[NSBundle mainBundle] pathForResource:@"Foo" ofType:@"momd"];
    NSURL *momURL = [NSURL fileURLWithPath:path];
    managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];

    return managedObjectModel; }
Run Code Online (Sandbox Code Playgroud)

其中'Foo'是数据模型的名称.

希望这对某些人有用 - 我花了太多时间在墙上敲打我的头.再次感谢Apple!:)


Mar*_*rra 23

持久性存储将一直保留,直到您从设备中删除应用程序,就像在模拟器中一样.如果你真的想重新开始,那么从iPad上删除应用程序,它将使用新的模型.

然而,正如其他人都指出的那样,这不是你得到的错误,做一个干净的应用程序构建(意味着从Xcode的菜单中选择Build - > Clean)并进行新的构建.如果错误仍然存​​在,那么您xcdatamodel在项目中编译了多个文件.


Tec*_*Zen 8

您的错误消息并不意味着您有两个数据库,即持久存储.这意味着您在Xcode项目中有两个重叠的模型文件(源文件).删除构建不好,因为项目只是在下一次构建时重新创建错误.

模型文件不能重叠.您需要删除重复.复制来自(1)具有相同文件的两个版本或(2)具有两个模型文件,两个模型文件具有相同的实体.

对于(1),您需要删除较旧的副本.模型文件的扩展名为modelName.xcdatamodel.要查找副本,请打开目标并在下方检查Compile Sources.目标中包含的所有模型文件都将列在那里.删除副本.

对于(2),您可以拥有任意数量的模型文件,但不能同时拥有两个具有相同实体的模型文件.有时,Core Data新手尝试通过共享一个或多个实体来链接到模型文件.如果您已经这样做了,则需要从其中一个模型中删除重复的实体.

  • 他可能要么重命名模型,要么设置一个版本,这两个版本都会在构建目录中留下一个旧的编译.mom文件.这是我看到的这个错误的第一个原因. (2认同)

Rus*_*add 6

从iPad中删除应用程序,然后重新启动它.iPad重新启动后,进行干净的构建.


Chr*_*lay 0

您最终会想要阅读有关模型迁移的内容,以便在用户升级时可以自动更新设备上的核心数据数据库。

但是,如果您处于开发阶段并且没有任何已安装的用户,则可以通过在连接设备的情况下进入 iTunes、从设备中删除应用程序并同步来清除核心数据数据库。然后将应用程序的新版本拖到 iTunes 中并重新同步。你应该有一个干净的模型。