0

我正在处理应用程序更新。我已经从头开始重写了应用程序,并切换到了用于模型控制的magicrecords 这是我的问题:

  1. 我创建了一个新的“newdatabase.xcdatamodel”文件,其中包含一个名为“foo”的实体。
  2. 在应用程序的第一个版本中,我还有一个“olddatabase.xcdatamodel”,其中还包含一个名为“foo”的实体
  3. 当用户从头开始安装应用程序时没有问题。
  4. 如果用户有以前版本的应用程序,他的设备有“olddatabase.mom”文件,其中还包含旧的“foo”实体,所以你可以想象,应用程序崩溃并出现错误:

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

那么是否有可能在加载新的 mom 文件之前检测并删除旧的“olddatabase.mom”文件?

我已经尝试了以下代码,就像我想的那样,我没有对该文件夹的权限:)

    NSString *path = [[NSBundle mainBundle]pathForResource:@"olddatabase" ofType:@"mom"];
if(path){
    NSError* error = nil;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    [fileManager removeItemAtPath:path error:&error];
    if(error)
        NSLog(@"Error: %@",[error description]);
}
NSLog(@"path = %@",path);

我开始考虑将我的新“foo”实体名称更改为“foo2”或其他名称,但我真的很着迷于为我使用的东西使用专有名称,所以我很高兴知道是否有办法做它。

感谢您阅读和(可能)回复:)

4

2 回答 2

2

好的,我遇到了完全相同的问题,这就是我解决它的方法...

我的新 .xcdatamodelD 有一个不同的名称。我认为这对我来说很重要,因为我可以指定 Magic Record 使用特定的 momd,而不是搜索捆绑包并抱怨:

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

所以这很简单。我只是告诉 Magic Record 专门使用一个新的 momd,然后使用以下设置调用创建核心数据堆栈...

[MagicalRecord setDefaultModelNamed:@"new_name.momd"];
[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"new_foosql.sqlite"];

如果你愿意,你可以核对你的旧 sql 数据存储,如果这就是你想做的,那么堆栈上有很多关于重置 coredata 的答案。

于 2013-06-14T15:19:50.143 回答
1

你所描述的没有意义:

A. 你不能从你的包中删除任何东西。它是只读的。

B. 当人们更新你的新版本时,你的包中应该没有 olddatabase.mom。它很可能位于应用程序的用户文档文件夹中。

如果我正确阅读了您的问题,那么您需要的是核心数据迁移。 尝试这个。

编辑:仅供参考

重新阅读OP的文字后,上面的B部分不正确。但由于 OP 已接受此作为答案,因此不允许删除答案。

于 2013-03-27T09:03:37.707 回答