1、CoreData概述

  • coreData用作数据持久化,是数据持久化的最佳方式,适合大量数据的存储和查询。
  • coreData不是数据库,coreData的最终存储形式可以是SQLite、XML二进制、内存、或自定义数据类型等方式来存储数据。
  • 使用coreData,需要导入CoreData框架。     

2、coreData优点

  1. 使用coreData操作数据,无需编写任何SQL语言
  2. SQLite通过SQL语句操作数据,coreData使用面向对象的方式操作数据
  3. 能够合理管理内存,避免使用SQL的麻烦,高效

3、coreData的主要对象

  • NSManagedObjectContext:管理对象的上下文,执行增删改查操作。
  • NSPersistentStoreCoordinator:负责连接数据库的桥梁
  • NSManagedObjectModel:数据模型文件
  • NSEntityDescription:实体描述(可以理解为表)
  • NSManagedObject:被管理的数据对象类型
  • NSFetchRequest:数据请求(相当于执行SQL语句)

4、代码展示:

4.1 打开数据库

     4.1.1 获取数据模型文件路径 (UserModel为使用CoreData创建的模型文件)
          NSURL *url = [[NSBundle mainBundle]URLForResource:@"UserModel" withExtension:@"momd"];
     4.1.2 根据创建的路径,将其转化为NSManagedObjectModel模型文件
          NSManagedObjectModel *dataModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:url];
     4.1.3 定义数据库文件的沙盒路径
          NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/CoreData.sqlite"];
          NSLog(@"filePath is:%@",filePath);
          NSURL *dbUrl = [NSURL fileURLWithPath:filePath];
     4.1.4 打开数据库文件(如果数据库文件不存在,则创建新的数据库文件。若存在,则直接打开)
          store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:dataModel];
          [store addPersistentStoreWithType:NSSQLiteStoreType //存储数据的类型
                              configuration:nil
                                        URL:dbUrl  //数据库文件的地址
                                    options:nil
                                      error:nil];
     4.1.5 初始化管理数据对象的上下文
          _moContext = [[NSManagedObjectContext alloc] init];
     4.1.6 设置属性,通过它管理数据对象
          _moContext.persistentStoreCoordinator = store;

4.2 添加数据库
     4.2.1 创建一个实体对象(插如一个user对象到user实体中),注意不能是用 alloc init方法
          User *user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:_moContext];
     4.2.2 设置添加内容
          user.userId = @30;
          user.userName = @"rose”;
          UIImage *image = [UIImage imageNamed:@"123"];
          //UIImagePNGRepresentation:将图片对象转化为data数据(png格式)
          user.userImg = UIImagePNGRepresentation(image);
     4.2.3 保存添加的内容(返回的bool值可用于判断是否成功保存)
          BOOL isSave = [_moContext save:nil];
          
4.3 查询数据
     4.3.1 创建查询请求
          NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User”];
     4.3.2 给查询请求添加查询条件
          request.predicate = [NSPredicate predicateWithFormat:@"userName LIKE 'j*' && userId > 10”];
     4.3.3 执行查询操作
          NSArray *users = [_moContext executeFetchRequest:request error:nil];
     4.3.4 遍历查询的内容
           for (User *user in users) {
             NSLog(@"user name is:%@",user.userName);
             NSLog(@"user id is:%@",user.userId);
         }

4.4 修改数据
     4.4.1 创建修改请求
          NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"User”];
     4.4.2 设置要修改的范围(添加谓词,修改名字为rose的内容)当sql语句封装到外面时若拼接不能直接在下面的方法里面拼接,可以先将sql语句拼接成字符串,然后给他。
          request.predicate = [NSPredicate predicateWithFormat:@"userName = 'rose'”];
     4.4.3 执行修改请求
          NSArray *roses = [_moContext executeFetchRequest:request error:nil];
     4.4.4 遍历修改
          for (User *user in roses) {
             user.userId = @50;
         }
     4.4.5 保存修改的内容(返回的bool值可用于判断是否成功保存)
          BOOL isSave = [_moContext save:nil];

4.5 删除数据
     4.5.1 创建删除请求
          NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"User”];
     4.5.2 执行删除(在上面可以通过设置request的predicate属性设置删除的范围)
          NSArray *array = [_moContext executeFetchRequest:request error:nil];
     4.5.3 遍历删除内容
           for (User *user in array) {
             //将数据从上下文种移除
             [_moContext deleteObject:user];
         }
     4.5.4 保存删除操作,对真正在数据库中的文件进行删除(返回的bool值可用于判断是否成功保存)
          BOOL delete = [_moContext save:nil];

4.6 异步操作--者查询
     4.6.1 创建一个上下文,注意该上下文的执行操作在私有队列中
          NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
     4.6.2 设置上下文的连接桥梁
          context.persistentStoreCoordinator = store;
     4.6.3 设置查询 (注意在私有线程中执行)
          [context performBlock:^{
             [self queryData];
         }];














     

posted on 2016-01-21 20:41  <孙涛>  阅读(114)  评论(0)    收藏  举报