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];
}
}];
}