coredata 数据迁移

 

 

当你不需要文件迁移的时候,也就是说 你就建一个的时候  只会有 绿色对号上面的一个,PushNoticationModel这个名字也可以和"PushNoticationModel.sqlite"  前缀不一样 比如说 ass.sqlite,一样可以运行的,不和一些网上人流传的一样必须保持一致。 但是你如果要进行数据迁移,升级 这个时候 你就需要保持一致了,我就是因为这个错误 一直没有迁移成功。

迁移的步骤 可以根据网上的进行操作

1.选择上你的xcdatamodel文件 Design -> Data Model -> Add Model Version 然后默认操作就可以了 那么就可以生成图片上的绿色箭头了。

2.然后系统会自动帮你将它设置成 当前版本。测试 数据迁移成功与否,你可以来回切换 下面的版本。步骤是 选择上级最上面的 xcdatamodeld ,在inspector中的Versioned Core Data Model选择你要的版本。

3. 对属性 进行添加 等轻量级 操作:选中绿色箭头,然后操作coredata。如果以前有旧的coredata 生成的entity类 删掉,,然后在绿色箭头的基础上重新生成。目的就是保持最新的属性和实体就好了。

4. 然后选择最上面的PushNoticationModel 右键  new file 选择coredate  然后 选择mapping model 就可以了

   剩下他默认操作。这些步骤 你都可以根据网上的其它文章进行操作

 

5. 然后修改代码,

 

-(NSPersistentStoreCoordinator *)persistentStoreCoordinator:(NSString*)modelName

{

    if (persistentStoreCoordinator != nil) {

        return persistentStoreCoordinator;

    }

 

    //得到数据库的路径

    NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

    //CoreData是建立在SQLite之上的,数据库名称需与Xcdatamodel文件同名 @"PushNoticationModel.sqlite"

    NSURL *storeUrl = [NSURL fileURLWithPath:[docs stringByAppendingPathComponent:modelName]];

    NSError *error = nil;

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:

     [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,

     [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

 

    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:[self getmanagedObjectModel:self.managedObjectModel]];

 

    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {

        NSLog(@"persistentStoreCoordinator Error: %@,%@",error,[error userInfo]);

    }

 

    return persistentStoreCoordinator;

}  主要是option 这个即使你不需要版本迁移 写上去也不会错

 

网上的人解释不清的,也就是我迷惑的地方是:

-(NSManagedObjectModel *)getmanagedObjectModel:(NSManagedObjectModel *)managedobjectModel

{

    if (managedobjectModel != nil) {

        return managedobjectModel;

    }

   // managedobjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];

    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"PushNoticationModel" withExtension:@"momd"];

    managedobjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

    return managedobjectModel;

}


   NSURL *modelURL = [[NSBundle mainBundleURLForResource:@"PushNoticationModel"withExtension:@"momd"];

到底用PushNoticationModel 还是用PushNoticationModel2? 答案是PushNoticationModel 和下面的生成数字没关系,这就是为什么苹果默认生成 2的时候前面有个空格的原因 PushNoticationModel 2,而我开始以为需要带2,所以修改了名字去掉了空格。

 

剩下要注意的地方是"PushNoticationModel.sqlite"  也不要带2.

 

我直做了添加属性 至于其它操作 或许你还要修改代码

你可能感兴趣的:(coredata)