数据持久化———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];
        }
       
    }];
}

时间: 2024-10-13 00:54:26

数据持久化———CoreData的相关文章

数据持久化CoreData()的使用

一.数据持久化CoreData数据库框架的优势  -  是对象(更适合面向对象编程) 收菜在IOS3.0版本的系统中出现,它允许按照实体- 属性- 值 模型组织数据,并以XML,二进制文件或者SOLite数据文件的格式持久化数据 二.数据持久化CoreData常见的类 实体管理类:NsManagedObiect 实体描述类:NSEntityDescription 数据管理器类:NSManagedObjectContext  - 临时的数据库(所有的操作全部在这里操作) 数据连接器类:NSPers

高级数据持久化 CoreData

一.ios3.0以后推出的  优点:不用写SQL语句 简化代码    以对象形式存储数据 更符合面向对象思想 CoreData允许按照 实体-属性-值 模型组织数据 以XML,二进制,SQLite 实体描述类:NSEntituDescripion创建对象 不用alloc init 数据连接器类(核心):NSPersistentStoreCoodinator 助理 数据管理器类(实际操作的临时数据库):NSManagedObjectContext(被管理对象的上下文) 数据模型器类(相当于数据库的

高级数据持久化之coredata

一.概述 CoreData是一个用于数据持久化的框架,Core Data支持4种类型的数据存储:SQLiteStore, XMLStore, BinaryStore, InMemoryStore. 注意:CoreData大部分情况下是基于SQLite数据库进行数据管理的,所以以下全部是其基于SQLite数据库的内容,以后学到更多的管理方法在补充! Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,

数据持久化-CoreData、SQLite、FMDB

1.CoreData 1.1 CoreData概述 1)Core data 是数据持久存储的最佳方式 2)Core Data 基于model-view-controller(mvc)模式下,为创建分解的cocoa应用程序提供了一个灵活和强大的数据模型框架. 3)Core Data可以是你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它. Core Data提供了基础结构去处理常用的功能,例如:保存,恢复,撤销和重做,允许你在app中继续创建新的任务.在使用 Core Da

IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)

IOS学习:ios中的数据持久化初级(文件.xml.json.sqlite.CoreData) 分类: ios开发学习2013-05-30 10:03 2316人阅读 评论(2) 收藏 举报 iOSXMLJSONSQLiteCoreData 一.文件操作 1.因为应用是在沙盒(Sandbox)中的,在文件读写权限上受到限制,只能在几个目录下读写文件: * Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录 * tmp:存放临时文件,iTunes不会备份和恢复

(转)iOS XML JSON SQLite CoreData 数据持久化

一.文件操作 1.因为应用是在沙盒(Sandbox)中的,在文件读写权限上受到限制,只能在几个目录下读写文件: * Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录 * tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除 * Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下的文件不会在应用退出删除 2.相关方法:       # 使用NSSearchPathForDiretoriesI

iOS 通过CoreData实现数据持久化

iOS 通过CoreData实现数据持久化引言: Core Data 是 iOS 3.0 以后引入的数据持久化解决方案,其原理是对 SQLite 的封装,是开发者不需要接触 SQL 语句,就可以对数据库进行的操作. 其编码方式和原理结构方面较为特殊,本博文主要介绍在使用 Core Data 时遇到的各种问题以及对其核心原理进行解释. 参考资料: 1: iOS 教程:Core Data 数据持久性存储基础教程 http://www.dasheyin.com/ios_jiao_cheng_core_

CoreData数据持久化

CoreData介绍 CoreData是一门功能强大的数据持久化技术,位于SQLite数据库之上,它避免了SQL的复杂性,能让我们以更自然的方式与数据库进行交互.CoreData提供数据–OC对象映射关系来实现数据与对象管理,这样无需任何SQL语句就能操作他们. CoreData数据持久化框架是Cocoa API的一部分,?次在iOS5 版本的系统中出现,它允许按照实体-属性-值模型组织数据,并以XML.?进制文件或者SQLite数据?件的格式持久化数据 CoreData与SQLite进行对比

数据持久化(六)之Using CoreData with MagicalRecord

第五节里面,我介绍了CoreData的配置和基本的增删改查,可能很多人会觉得用它真繁琐.这里,我再介绍网上大神对它进行了人性化封装的第三方MagicalRecord,正如FMDB对sqlite进行了封装一样,MagicalRecord让你觉得用CoreData很方便. @基本配置: 1.下载MagicalRecord,将里面的MagicalRecord文件夹拖入你的工程 2.确定你创建的工程没有勾选"Use Core Data" 3.导入CoreData.frame框架 4.在.pch