码迷,mamicode.com
首页 > 其他好文 > 详细

数据持久化———CoreData

时间:2015-10-15 10:11:25      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:coredata   数据迁移   轻量迁移   coredata的基本用法   

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


本文出自 “UI中的控件的应用” 博客,请务必保留此出处http://10554206.blog.51cto.com/10544206/1703044

数据持久化———CoreData

标签:coredata   数据迁移   轻量迁移   coredata的基本用法   

原文地址:http://10554206.blog.51cto.com/10544206/1703044

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!