1.Core data 使用面向对象的方式操作数据,用来解决与对象生命周期管理,对象关系图管理和持久化等方面相关的问题
2.使用core Data 的版本偏移问题
对数据模型进行版本管理
数据迁移:不同版本数据模型之间进行转换的机制
轻量级迁移
标准迁移
轻量迁移和标准迁移的区别:
CoreData支持两种不同类型的迁移。轻量迁移和标准迁移。
如果你添加或移除了实体中的属性,或者在数据模型中新增或删除实体,轻量迁移即可,但如果将一个实体切分成两个不同的实体,或者将某个属性从一个实体中移动到另一个实体,轻量迁移无效,需要用标准迁移。
1. 关于数据模型
数据模型会被编译
-
.xcdatamodel文件会编译成一种新的文件,其扩展名为.mom,它表示Managed Object Model。
数据模型可以拥有多个版本
创建新数据模型
-
选中模型--》点击Editor菜单--》选择Add Model Version
2. 迁移
-
用于相对简单的数据模型修改。(如简单的添加或移除实体中的属性,或添加移除实体)。
// 在设置持久化存储助手的时候进行一些修改
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]){}// 替换为NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption:@YES,NSInferMappingModelAutomaticallyOption:@YES};if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]){}轻量迁移
core Data 使用的步骤
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. [self openDataBase]; //当数据库有数据保存时系统就会发出通知 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(notificationAction:) name:NSManagedObjectContextDidSaveNotification object:nil];}- (void)notificationAction:(NSNotification *)notification{ NSManagedObjectContext *savaContext = notification.object; if (savaContext == context || savaContext.persistentStoreCoordinator != context.persistentStoreCoordinator) { return; } //当要保存的NSManagedObjectContext对象与自身对象不同时,回到主线程对数据进行合并 dispatch_async(dispatch_get_main_queue(), ^{ //回到主线程对数据进行合并 [context mergeChangesFromContextDidSaveNotification:notification]; }); }- (void)openDataBase{ //1.加载数据库模型文件 NSURL *url = [[NSBundle mainBundle]URLForResource:@"DBModel" withExtension:@"momd"]; //MOM NSManagedObjectModel *dataModel = [[NSManagedObjectModel alloc]initWithContentsOfURL:url]; //2.打开数据库 store = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:dataModel]; //定义数据库文件的路径 NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"/Documents/coreData.sqlite"]; NSURL *dbUrl = [NSURL fileURLWithPath:filePath]; NSError *error = nil; [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:dbUrl options:nil error:&error]; if (error) { NSLog(@"打开数据库失败-%@",error); }else{ NSLog(@"打开数据库成功"); } //3.对数据库进行操作 context = [[NSManagedObjectContext alloc]init]; context.persistentStoreCoordinator = store; }- (IBAction)addData:(id)sender { for (int i = 0; i < 100; i ++) { User *user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:context]; user.userID = [@(i) stringValue]; user.name = [NSString stringWithFormat:@"name--%d",i]; user.age = @(i); } if ([context save:nil]) { NSLog(@"数据添加成功"); }else{ NSLog(@"数据添加失败"); } }//同步查询- (IBAction)sysQuery:(id)sender { NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"]; NSArray *array = [context executeFetchRequest:request error:nil]; for (User *user in array) { NSLog(@"name:%@ userid:%@ age:%@ ",user.name,user.userID,user.age); } }//异步查询- (IBAction)asysQuery:(id)sender { //创建异步线程队列,将数据查询放入到异步线程队列中 NSOperationQueue *queue = [[NSOperationQueue alloc]init]; [queue addOperationWithBlock:^{ //注意:要将异步线程中的执行代码放入到自动释放池中 @autoreleasepool { //多线程 //1.创建MOC //在多线程中,MOC要重新创建,而PSC 可以用同一个 NSManagedObjectContext *contxt = [[NSManagedObjectContext alloc]init]; //2.创建PSC contxt.persistentStoreCoordinator = store; NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"]; NSArray *array = [contxt executeFetchRequest:request error:nil]; for (User *user in array) { user.age = @([user.age intValue] + 10000); NSLog(@"name:%@ userid:%@ age:%@ ",user.name,user.userID,user.age); } //保存 [contxt save:nil]; } }];}