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

时间:2010-07-08 16:21:41

标签: iphone database file core-data

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

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

 Can't merge models with two different entities named 'foo'

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

我重建应用程序,定位iPad,并得到同样的错误。

有没有让旧数据库真正消失的技巧?

9 个答案:

答案 0 :(得分: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; }

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

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

答案 1 :(得分:23)

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

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

答案 2 :(得分:8)

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

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

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

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

答案 3 :(得分:6)

从iPad中删除该应用,然后重新启动它。重新启动iPad后,请进行干净的构建。

答案 4 :(得分:3)

重命名数据库模型后,我遇到了类似的问题。清理,重建和重新安装应用程序后 - 相同的结果:应用程序包(oldname.momd和newname.momd)中出现两个具有相同内容的不同名称.momd包。
我通过在“核心数据模型”(数据模型的文件检查器)面板中将“工具版本”从4.1更改为3.2来解决了这个问题。在此之后,我完全清理并重新构建项目,然后将此属性更改回4.1并再次重新清除并重新构建应用程序。
在这种情况下,Xcode对* .xcdatamodeld包中的“contents”生成两个文件“layout”和“elements”(对于旧版本兼容性),这导致Xcode的数据模型编译器重新检查模型的名称,并且一切都会好的。应用程序沙箱中的momd捆绑包 - 重新安装应用程序后只显示一个。

答案 5 :(得分:2)

  

“无法将模型合并为两个   名为'foo'“的不同实体

这听起来更像是两个合并的数据模型。尝试干净重建您的应用程序。 检查项目中是否只有一个数据模型。

默认核心数据堆栈加载捆绑包中的所有数据模型

managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];   

如果存在旧模型,则所有模型都会合并。

答案 6 :(得分:1)

对我来说,只有模拟器的“重置内容和设置”才有效。否则我发现我的项目没有任何问题。

答案 7 :(得分:0)

您最终想要了解model migration,以便在用户升级时自动更新设备上的核心数据数据库。

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

答案 8 :(得分:0)

我遇到了同样的问题 尝试在Xcode中清除 Shift + Cmnd + K 并清除构建文件夹 ALT + Shift + Cmnd + K 。这对我很有用。