iOS CoreData实例变量属性类型修改
1 我们先创建一个包含.xcdatamodeld文件的工程,然后声明一个实例变量,此处我以StudentModel来作为变量
2 然后我们在viewController.m中import该实例变量,xcode9.0之前我们需要把实例变量导入到项目中,之后的系统会自动把相关的类创建,我们只需要在需要用到的地方直接import即可.此处为了便于展示数据,我创建了一个简单的tableView用以展示数据
3 创建三个StudentModel的对象,此处我单独创建一个CoreData管理类,也可以在ViewController.m里直接声明NSManagedObjectContext,实际开发中建议单独创建一个管理类,管理类代码如下
.h文件:
//
// CoreDataManager.h
// CoreDataDemo
//
// Created by zhaoxiafei on 2018/5/21.
// Copyright © 2018年 ***. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface CoreDataManager : NSObject
@property(nonatomic,strong)NSManagedObjectContext *objectContext;
+(instancetype)shareManager;
+(void)save:(NSError **)error;
+(NSArray *)getArrayWithPredicate:(NSPredicate *)predicate entityName:(NSString *)entityName;
@end
///////
.m文件
#import "CoreDataManager.h"
#import "AppDelegate.h"
@implementation CoreDataManager
+(instancetype)shareManager
{
static CoreDataManager *manager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[CoreDataManager alloc]init];
});
return manager;
}
+(NSArray *)getArrayWithPredicate:(NSPredicate *)predicate entityName:(NSString *)entityName
{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName];
if (predicate) {
request.predicate = predicate;
}
return [[CoreDataManager shareManager].objectContext executeFetchRequest:request error:nil];
}
+(void)save:(NSError **)error
{
[[CoreDataManager shareManager].objectContext save:error];
}
-(NSManagedObjectContext *)objectContext
{
if (!_objectContext) {
self.objectContext = ((AppDelegate *)[UIApplication sharedApplication].delegate).persistentContainer.viewContext;
}
return _objectContext;
}
@end
4 在viewController创建假数据并展示:
5 创建后的效果图如下:
6 现在修改StudentModel的age属性为String,并运行,不出意外,是会闪退的,此处不再展示崩溃效果,感兴趣的小伙伴可以自己试一试.创建一个新的model version
7 此时修改第二个版本2的StudentModel的age为string,并设置该版本数据库为指定版本:
8 创建map model,并选择source model为CoreDataDemo,target model 为CoreDataDemo 2
9 自定义迁移策略
10 指定mapmodel的迁移策略为新建的自定义策略
11 在自定义迁移策略里实现该方法
12 运行
总结: 这样的迁移方式会造成原始数据的丢失,感觉像是因为类型没有匹配导致该实例变量迁移失败,不过不会造成闪退,后面我会尝试着再去找找看有没有完美迁移过去的方法,找到了再补充上