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 运行


总结: 这样的迁移方式会造成原始数据的丢失,感觉像是因为类型没有匹配导致该实例变量迁移失败,不过不会造成闪退,后面我会尝试着再去找找看有没有完美迁移过去的方法,找到了再补充上


猜你喜欢

转载自blog.csdn.net/developer_zhao/article/details/80387785