标签: core-data-migration

重命名coredata .xcdatamodeld文件和迁移

我们有两个独立的应用程序,我们已合并到同一工作区中的2个目标.两者都有他们的核心数据模型(app1.xcdatamodeldapp2.xcdatamodeld).

既然两者都在同一个工作区,就不需要2个模型,因为它们有99%的相似性.所以我想将.xcdatamodeld包的名称更改为allApps.xcdatamodeld.我能够重命名它,但是在执行此操作时我没有找到有关迁移行为的任何参考.

这是错误 -

2015-07-28 09:04:06.079 AppName[51306:1423128] CoreData: error:
-addPersistentStoreWithType:SQLite configuration:(null) URL:file:///Users/shani/Library/Developer/CoreSimulator/Devices/EA75A69F-B108-4036-AB3D-B923F83D16DE/data/Containers/Data/Application/B1CB3AF3-DEF4-40DF-9A61-721063ECBB1D/Documents/AppName.sqlite
options:{
    NSInferMappingModelAutomaticallyOption = 1;
    NSMigratePersistentStoresAutomaticallyOption = 1;
    NSSQLitePragmasOption =     {
        "journal_mode" = WAL;
    }; } ... returned error Error Domain=NSCocoaErrorDomain Code=134130 "The operation couldn’t be completed. (Cocoa error
134130.)" UserInfo=0x7fc39c194360 {URL=file:///Users/shani/Library/Developer/CoreSimulator/Devices/EA75A69F-B108-4036-AB3D-B923F83D16DE/data/Containers/Data/Application/B1CB3AF3-DEF4-40DF-9A61-721063ECBB1D/Documents/AppName.sqlite,
metadata={
    NSPersistenceFrameworkVersion = 519;
    NSStoreModelVersionHashes =     {
        Attempt = <b4d1e878 69a97917 e751a67c 89e1887a ae4df1dc f380e4ee c9585f60 f39ff51e>;
        BookmarkFlashcard = <33112f7c 2fa20bec eb2e019c b5d619b4 92be2547 a65fabee 1ac86ab7 92dd77bb>;
        BookmarkQuestion = …
Run Code Online (Sandbox Code Playgroud)

xcode core-data core-data-migration ios

13
推荐指数
1
解决办法
3482
查看次数

核心数据迁移失败,"无法找到源存储的模型",但存在源的managedObjectModel

我有一个使用核心数据的cocoa应用程序,它现在是其托管对象模型的第4版.

我的托管对象模型包含抽象实体,但到目前为止,我已设法通过创建适当的映射模型并使用addPersistentStoreWithType创建我的持久存储来实现迁移:配置:options:error并将NSMigratePersistentStoresAutomaticallyOption设置为YES.

NSDictionary *optionsDictionary = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
NSURL *url = [NSURL fileURLWithPath: [applicationSupportFolder stringByAppendingPathComponent: @"MyApp.xml"]];
NSError *error=nil;
[theCoordinator addPersistentStoreWithType:NSXMLStoreType configuration:nil URL:url options:optionsDictionary error:&error]
Run Code Online (Sandbox Code Playgroud)

当我从模型版本3迁移到4时,这种方法很有效,这是一个涉及向多个实体添加属性的迁移.现在,当我尝试添加新的模型版本(版本5)时,对addPersistentStoreWithType的调用返回nil,错误仍为空.从4迁移到5涉及添加单个属性.

我正在努力调试问题,并检查了以下所有内容;

  1. 源数据库实际上是版本4,而persistentStoreCoordinator的托管对象模型是版本5.

  2. 4-> 5映射模型以及版本4和5的托管对象模型存在于我构建的应用程序的resources文件夹中.

  3. 我尝试了各种模型升级路径.奇怪的是,我发现从早期版本3 - > 5升级工作..但从4 - > 5升级失败.

  4. 我已经尝试添加自定义实体迁移策略,用于迁移属性正在发生变化的实体...在这种情况下,我覆盖了方法beginEntityMapping:manager:error :. 有趣的是,当迁移工作时(即当我从3迁移到4或从3迁移到5)时,会调用此方法,但在失败的情况下(4到5)不会调用它.

关于在哪里继续,我几乎不知所措.任何有助于调试此问题的想法都将非常感激.

cocoa core-data core-data-migration mapping-model

12
推荐指数
1
解决办法
6507
查看次数

如何使用App Store中的应用程序测试核心数据迁移?

我们有一个应用程序,目前在应用商店中.它使用Core Data作为其持久性机制.我们准备好了新版本,并且它有一些架构更改.具体来说,我们添加了1个新实体,并为现有实体添加了新属性.根据我的理解和阅读,这是可以发生的最简单的迁移之一.没有字段删除,也没有要更改的关系.数据模型由5个实体组成,完全没有关系.

我们对数据模型进行了版本化,并创建了一个.xcmappingmodel来处理迁移.我们通过在PersistentStoreCoordinator的创建中添加以下选项来处理迁移:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                     [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, nil];
Run Code Online (Sandbox Code Playgroud)

目前,我们已使用以下流程成功测试了该团队的多名成员:

  1. 从设备和iTunes中删除应用程序的所有测试版本
  2. 转到应用商店并下载当前版本
  3. 对应用程序进行一些更改,以证明迁移是成功的
  4. 将新二进制文件(使用相同的包标识符签名)拖到iTunes中并同步
  5. 在设备上加载新版本,验证先前版本中所做的更改是否仍然存在,以及应用程序是否崩溃

我的问题是:有更简单/更好的方法来测试吗?我们担心的是,一旦应用程序出现,没有其他方法可以确保我们的用户获得最佳体验.

core-data core-data-migration ios

12
推荐指数
1
解决办法
3402
查看次数

特定版本的轻量级迁移后自定义代码执行

我在Core Data中有2个对象模型(比如v1和v2).此迁移适用于轻量级迁移.现在,我希望在迁移后执行自定义代码,但仅在迁移从v1到v2时执行.稍后如果我介绍v3,我不希望自定义代码被执行.

有没有办法做到这一点?

在此先感谢,Anupam

iphone core-data core-data-migration ios4

12
推荐指数
2
解决办法
511
查看次数

核心数据迁移:如何删除核心数据堆栈?

我的计划是删除旧的Core Data堆栈(NSManagedObjectModel .momd文件和NSPersistentStore .sqlite文件),因为:

  • 我没有Core Data迁移的经验.
  • 新的.xcdatamodel架构与旧架构完全不同.
  • 我可以安全地删除用户的旧数据,因为它全部存储在我们的服务器上,新应用程序无论如何都会从我们的服务器下载最新的数据.

在这种情况下,是否完全删除了迁移的最佳方式?

iphone core-data objective-c core-data-migration ios

12
推荐指数
1
解决办法
3309
查看次数

我没有在新版本中迁移NSPersistentStore,我可以通过应用更新进行恢复吗?

长话短说,我的核心数据架构已经更改,我的应用程序已提交到应用程序商店,这导致更新应用程序的所有人崩溃.崩溃是NSPersistentStore由于未正确迁移数据模型而导致丢失.

我仍然在文档目录中看到.sqlite和相关的数据库文件,如果我降级到旧版本,一切都可以正常使用所有数据.我的问题是,我可以通过以某种方式迁移现有的NSPersistentStore并将其添加到NSPersistentStoreCoordinator来更新应用程序吗?

编辑:所以我自己并没有真正改变我的xcdatamodel,因此,"长话短说".但是,我确实从我的项目中删除了XMPPFramework,我觉得这可能会导致核心数据问题.

编辑:
我没有直接对我的数据模型进行任何更改,但我已经确定了问题所在.我正在检索我的NSManagedObjectModel使用[NSManagedObjectModel mergedModelFromBundles:nil],它合并了捆绑包中的所有数据模型.这包括XMPPFramework附带的所有数据模型,现在框架已被删除,传入的NSManagedObjectModel [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel]是不同的,从而导致崩溃.

我通过使用FMDB获取现有数据库的内容解决了这个问题,然后创建了一个新的sqlite文件,并将持久存储协调器指向该新的sqlite文件.然后我通过循环现有数据并创建适当的NSManagedObjects,将所有现有数据插入到新数据库中.我也停止使用mergedModelFromBundles检索我的数据模型而是使用initWithContentsOfURL.

sqlite core-data core-data-migration ios

12
推荐指数
1
解决办法
2134
查看次数

iOS 10核心数据异常代码错误:(6922)

尝试在iOS 10上迁移Core Data时,我们遇到了SQL数据库的异常.抛出异常但似乎迁移仍然成功.我们进行手动迁移,然后MagicalRecord处理其余的设置.有没有其他人经历过这个/知道如何解决这个问题?

错误输出:

    CoreData: error: (6922) I/O error for database at /var/mobile/Containers/Data/Application/9CA333FB-49CB-4168-B26A-A6F6E6CF94C7/Documents/Messaging.sqlite.  SQLite error code:6922, 'disk I/O error'
CoreData: error: -addPersistentStoreWithType:SQLite configuration:(null) URL:file:///var/mobile/Containers/Data/Application/9CA333FB-49CB-4168-B26A-A6F6E6CF94C7/Documents/Messaging.sqlite options:{
NSInferMappingModelAutomaticallyOption = 1;
NSMigratePersistentStoresAutomaticallyOption = 1;
NSSQLitePragmasOption =     {
    "journal_mode" = WAL;
};
} ... returned error Error Domain=NSCocoaErrorDomain Code=256 "The file couldn't be opened." UserInfo={NSSQLiteErrorDomain=6922, NSUnderlyingException=I/O error for database at /var/mobile/Containers/Data/Application/9CA333FB-49CB-4168-B26A-A6F6E6CF94C7/Documents/Messaging.sqlite.  SQLite error code:6922, 'disk I/O error'} with userInfo dictionary {
NSSQLiteErrorDomain = 6922;
NSUnderlyingException = "I/O error for database at /var/mobile/Containers/Data/Application/9CA333FB-49CB-4168-B26A-A6F6E6CF94C7/Documents/Messaging.sqlite.  SQLite error …
Run Code Online (Sandbox Code Playgroud)

sqlite core-data core-data-migration ios swift3

12
推荐指数
1
解决办法
1681
查看次数

使用mergedModelFromBundles:和版本控制(CoreData)

我正在尝试使用CoreData中的迁移功能.我已经关注了Apple文档.我在以下方法中遇到问题:

/**
 Returns the managed object model for the application.
 If the model doesn't already exist, it is created by merging all of the models found in the application bundle.
 */
- (NSManagedObjectModel *)managedObjectModel {

    if (managedObjectModel != nil) {
        return managedObjectModel;
    }
    /* 
     * NSInvalidArgumentException', reason: '*** -[NSCFArray insertObject:atIndex:]: attempt to insert nil'
     * 2010-02-17 16:27:15.338 Patrimoine[3037:207]
     */ 
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];    
    return managedObjectModel;
}
Run Code Online (Sandbox Code Playgroud)

http://iphonedevelopment.blogspot.com/2009/09/core-data-migration-problems.html上似乎存在同样的问题

然而,我确实选择了Apple建议的方法,使用菜单选项"添加模型版本".

你有什么主意吗?

iphone core-data core-data-migration

11
推荐指数
2
解决办法
2万
查看次数

将多对多关系迁移到Core Data中的连接表

我有一个iPhone应用程序,它使用多对多关系将标签和注释链接在一起.我目前正在使用Core Data的"关系"功能来完成此任务,但我想迁移到使用连接表.

这是我的挑战:我想从旧模型迁移到连接表模型,我需要弄清楚如何执行数据迁移.

有什么好的例子说明如何做到这一点?

更新:我在这里澄清我的问题,以帮助解决这里发生的事情:我想尝试使用Simperium来支持我们的应用程序,但是Simperium不支持多对多关系(!).

作为我正在尝试做的一个例子,让我们以iPhoneCoreDataRecipes应用程序为例.

以下是我的核心数据方案目前的类似内容: 在此输入图像描述

......这就是我要过渡到的地方: 在此输入图像描述

我如何从一个到另一个,并带来数据?

Apple的Core Data Migration文档非常稀疏,我没有看到任何有用的演练来使用NSEntityMapping或NSMigrationManager子类来完成工作.

iphone core-data core-data-migration ios simperium

11
推荐指数
1
解决办法
3312
查看次数

使用NSInferMappingModelAutomaticallyOption更改核心数据中的属性类型

我有我的核心数据存储,我使用标志'NSInferMappingModelAutomaticallyOption',这样每当我更改核心数据模型时,我首先创建一个新的模型版本,并自动迁移对数据模型的更改.

但是,我需要更改其中一个实体的属性类型.当我这样做时,自动迁移似乎不起作用,当我尝试运行我的应用程序时,我收到了Core Data错误.

有任何设置方法可以继续自动模型迁移吗?

core-data objective-c core-data-migration

11
推荐指数
2
解决办法
5931
查看次数