• 数据库CoreData 的简单使用(1)


    一、CoreData的概述。

      1.简介

    • CoreData ⽤用于做数据持久化,是数据持久化的最佳⽅方式, 适合⼤大数据量的存储和查询
    • CoreData不是数据库,CoreData数据的最终存储形式可以是SQLite数据库、XML、二进制、内存里,或者是自定义数据类型来存储数据
    • 使用CoreData,需要导入CoreData框架(如果开始创建新的工程时候✅use CoreData选项,就不用导入了,但是需要在代码中导入)

        2.优点

    • 使用CoreData操作无无需编写SQL语句

    •  SQlite通过使用SQL语句操作对象,CoreData使用面向对象的方式操作数据

    • 能够合理管理内存,避免使用sql的麻烦,高效

      3.CoreData的主要对象(构成)

    1. NSManagedObjectContext :  负责应用和数据酷之间的交互(CRUD)
    2. NSPersistentStoreCoordinator:添加持久化存储助理,是物理数据存储的物理文件和程序之间的联系桥梁,相当于数据库的连接器,负责管理不同对象的上下文
    3. NSManagedObjectModel  :被管理的对象模型,对应定义的模型文件
    4. NSEntityDescription :实体描述(结构),相当于表格结构
    5. NSManagedObject:被管理的数据记录,相当于表格的数据记录
    6. NSFetchRequest :数据请求,相当于查询语句

    二、直接使用Core Data 写数据

    步骤:

    (1)创建数据模型

    (2)代码如下

    需要导入头文件

     NSManagedObjectContext *_context; 

     1  //1.获取数据模型地址
     2     NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
     3     //2.读取数据模型
     4     NSManagedObjectModel *dataModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:fileURL];
     5     //3.根据model初始化数据助理
     6     NSPersistentStoreCoordinator *coodinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:dataModel];
     7     //4.将数据存储到沙盒下
     8     NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Documents/coreData.db"];
     9     NSURL *pathURL = [NSURL fileURLWithPath:path];
    10     NSLog(@"%@", path);
    11     NSError *error = nil;
    12     NSPersistentStore *store = [coodinator addPersistentStoreWithType:NSSQLiteStoreType //存储的形式(我选择的是SQLite存储,还有另外三种)
    13                                                         configuration:nil URL:pathURL options:nil error:&error];
    14     if (store == nil) {//数据库存在异常 直接抛异
    15         [NSException raise:@"" format:@"error: %@", [error localizedDescription]];
    16     }
    17     if (error) {
    18         
    19         NSLog(@"open error :%@", error);
    20     }else {
    21         
    22         NSLog(@"open success");
    23     }
    24     _context = [[NSManagedObjectContext alloc] init];
    25     _context.persistentStoreCoordinator = coodinator;

    ***PersistentStoreWithType存储的形式有以下四种:

    •  NSSQLiteStoreType :  SQLite数据库
    •  NSXMLStoreType:XML存储形式
    •  NSBinaryStoreType:二进制平面文件
    •  NSInMemoryStoreType:内存库
    虽然这3种类型的性能从速度上来说都差不多,但从数据模型中保留下来的信息却不一样,在几乎所有的情景中,都应该采用默认设置,使用SQLite作为持久化存储库。

    运行结束之后:

    可以根据地址去访问:

    打开方式:

    文件存在查看:

    属性添加查看:

    可以看出,.使用SQLite存储时,数据库结构存储的SQLite数据库表名称:大写“Z”加上实体名称大写,一个实体相当于一张表,具体的字段名称:大写“Z”加上实体属性名称大写

    三、对数据进行操作(增删改)

    (1)添加数据。

    封装一个方法直接进行数据的添加。

     1 //添加数据
     2 - (NSManagedObject *)insertEntity:(NSString *)entityName withParams:(NSDictionary *)params {    
     3     // 1. 根据模型初始化一个对象
     4     NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:_context];
     5     //添加的数据内容
     6     /*以下数据是字典中的写入数据
     7     [object setValue:@"玛瑙" forKey:@"name"];
     8     [object setValue:@18 forKey:@"age"];
     9      */
    10     //用字典接收外部传值
    11     for (NSString *key in params) {
    12         NSLog(@"%@",key);
    13         [object setValue:[params objectForKey:key] forKey:key];
    14     }
    15     NSError *error = nil;
    16     //保存数据
    17     BOOL success = [_context save:&error];
    18     if (success) {
    19         NSLog(@"添加数据成功");
    20     }else {
    21         NSLog(@"添加数据失败");
    22     }
    23     return object;
    24 }

    (2)查询数据

    封装一个方法,用来查询数据。

     1 //查询数据
     2 - (NSArray *)queryWithEntity:(NSString *)entityName withPredicate:(NSString *)predicate withSortDescriptor:(NSArray *)sorts{
     3     //1.构造一个查询请求
     4     NSFetchRequest *request = [[NSFetchRequest alloc] init];
     5     //2.设置查询请求的模型(实体)
     6     request.entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:_context];
     7     //3.设置查询条件
     8     NSPredicate *dicate = [NSPredicate predicateWithFormat:predicate ];
     9     request.predicate = dicate;
    10     //设置分页
    11     [request setFetchOffset:0];//读取数据库的游标偏移量,从游标开始读取数据
    12     [request setFetchLimit:5];//每次要取多少条数据,5就是每次从数据库读取5条数据
    13 //    [request setFetchBatchSize:500];//从数据库里每次加载500条数据来筛选数据,用于下拉刷新等
    14     if (sorts) {
    15         //排序设置 NSSortDescriptor:排序条件  可任意存在多个
    16         NSMutableArray *sortArr = [[NSMutableArray alloc] init];
    17         //遍历传入的排序条件字符串数组,生成排序条件
    18         for (NSString *sortString in sorts) {
    19             //遍历结果
    20             NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:sortString ascending:YES];
    21             //加入数组
    22             [sortArr addObject:sort];
    23         }
    24         //将排序条件的数组查询请求,按数组的前后确定排序的优先级
    25         request.sortDescriptors = sortArr;
    26     }    
    27     //4. 执行查询请求
    28     NSError *error = nil;
    29     NSArray *objects = [_context executeFetchRequest:request error:&error];
    30     if (error) {
    31         NSLog(@"查询失败: %@",error);
    32         //失败之后返回nil
    33         return nil;
    34     }else {
    35         NSLog(@"查询成功");
    36     }
    37     return objects;
    38 }

    (3)删除数据

    删除数据和修改数据都需要用到查询。

     1 //删除数据
     2 - (void)deleteWithEntity:(NSString *)entityName withPredicate:(NSString *)predicate {
     3     //调用查询方法(查询方法是一个数组,因此用 ‘NSArray *’ 接收)
     4     NSArray *objects = [self queryWithEntity:entityName withPredicate:predicate withSortDescriptor:nil];
     5     
     6     for (NSManagedObject *object in objects) {
     7         //删除选择的项
     8         [_context deleteObject:object];
     9 //        NSLog(@"删除成功");
    10     }
    11     //使数据库的内容与上下文的内容同步,(我们对数据的增删改都是对上下文的修改,需要通过助理与数据库进行刷新同步。nil是错误码--error)
    12     [_context save:nil];
    13 }

    由此看出,封装一个好的方法的重要性。

    下一篇将介绍两个文件进行连接的方法,以及基于SQLite使用Core Data。

    欢迎读者查看,有错欢迎指正。本文是原创文章,如若转载请标明出处。

  • 相关阅读:
    任意数字 保留 两位 小数 PHP
    在JavaScript中处理JSON数据 jquery js 定义 json 格式
    相对定位 绝对定位 relative absolute position 图片定位a标签
    oracle: listener.ora 、sqlnet.ora 、tnsnames.ora的配置及例子
    python
    python
    python-判断alter是否存在
    python-IE浏览器调用
    Python语言编写脚本时,对日期控件的处理方式
    python报错UnicodeDecodeError:
  • 原文地址:https://www.cnblogs.com/david-han/p/4878305.html
Copyright © 2020-2023  润新知