• Core Data 的使用


    一、概念

    1.Core Data 是数据持久化存储的最佳方式

    2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型

    Mac OS X 10.5Leopard及以后的版本中,开发者也可以通过继承NSPersistentStore类以创建自定义的存储格式

    3.好处:能够合理管理内存,避免使用sql的麻烦,高效

    4.构成:

    (1)NSManagedObjectContext(被管理的数据上下文)

    操作实际内容(操作持久层)

    作用:插入数据,查询数据,删除数据

    (2)NSManagedObjectModel(被管理的数据模型)

    数据库所有表格或数据结构,包含各实体的定义信息

    作用:添加实体的属性,建立属性之间的关系

    操作方法:视图编辑器,或代码

    (3)NSPersistentStoreCoordinator(持久化存储助理)

    相当于数据库的连接器

    作用:设置数据存储的名字,位置,存储方式,和存储时机

    (4)NSManagedObject(被管理的数据记录)

    相当于数据库中的表格记录

    (5)NSFetchRequest(获取数据的请求)

    相当于查询语句

    (6)NSEntityDescription(实体结构)

    相当于表格结构

    (7)后缀为.xcdatamodeld的包

    里面是.xcdatamodel文件,用数据模型编辑器编辑

    编译后为.momd或.mom文件

    二.代码的实现 :

      1 #import "ViewController.h"
      2 #import "Movie.h"
      3 
      4 //导入框架
      5 #import <CoreData/CoreData.h>
      6 
      7 
      8 @interface ViewController ()
      9 
     10 {
     11     NSManagedObjectContext *manageObjectContext;  //上下文
     12    
     13 }
     14 @property (weak, nonatomic) IBOutlet UITextField *titleTextField;
     15 @property (weak, nonatomic) IBOutlet UITextField *ratingTextField;
     16 
     17 
     18 
     19 - (IBAction)insertAction:(id)sender;
     20 
     21 - (IBAction)updateAction:(id)sender;
     22 - (IBAction)deleteAction:(id)sender;
     23 - (IBAction)queryAction:(id)sender;
     24 
     25 @end
     26 
     27 @implementation ViewController
     28 
     29 - (void)viewDidLoad {
     30     [super viewDidLoad];
     31    
     32     /*
     33     
     34     1.应用程序包的路径
     35       NSLog(@"%@",[[NSBundle mainBundle] resourcePath]);
     36     
     37      */
     38    
     39     //加载文件  (注意加载的文件的类型,由上面程序语句得到)
     40     NSString *filePath = [[NSBundle mainBundle]pathForResource:@"MovieInfo.momd" ofType:nil];
     41     //1.加载数据模型文件  本地文件用fileURLWithPath
     42     NSManagedObjectModel *manageModel = [[NSManagedObjectModel alloc]initWithContentsOfURL:[NSURL fileURLWithPath:filePath]];
     43    
     44     //2.持久化数据存储调度器,指定存储的方式,负责应用与数据库之间的操作
     45     NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:manageModel];
     46    
     47     //3.指定数据库的路径
     48 
     49     NSString *dbFilePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/CoreData.db"];
     50     NSLog(@"dbFilePath = %@",dbFilePath);
     51    
     52     //4.添加持久化存储的方式(可以是数据库,也可以是XML),并且会打开数据库
     53    
     54     NSError *error = nil;
     55    
     56     [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:dbFilePath] options:nil error:&error];
     57     if (error) {
     58         NSLog(@"打开数据库失败!");
     59     }
     60     else{
     61         NSLog(@"打开数据库成功!");
     62        
     63     }
     64    
     65     //5.存储数据,更新数据  上下文
     66     manageObjectContext = [[NSManagedObjectContext alloc]init];
     67    
     68     //将上下文设置到调度器上
     69     [manageObjectContext setPersistentStoreCoordinator:coordinator];
     70    
     71 
     72 }
     73 
     74 
     75 //插入数据
     76 - (IBAction)insertAction:(id)sender {
     77    
     78  
     79     //6.存储数据,将对象映射到数据库
     80     Movie *movie = [NSEntityDescription insertNewObjectForEntityForName:@"Movie" inManagedObjectContext:manageObjectContext];
     81    
     82     movie.title = _titleTextField.text;
     83     movie.rating = @([_ratingTextField.text doubleValue]);
     84     movie.year = [NSDate date];
     85    
     86     //将数据添加到上下文
     87     [manageObjectContext insertObject:movie];
     88    
     89     //将数据保存到数据库
     90     BOOL isSuccess = [manageObjectContext save:nil];
     91     if (isSuccess) {
     92         NSLog(@"插入数据成功!");
     93     }
     94     else
     95     {
     96         NSLog(@"插入数据失败!");
     97     }
     98    
     99 
    100 }
    101 
    102 
    103 //更新数据
    104 - (IBAction)updateAction:(id)sender {
    105    
    106     //1.创建请求对象,请求对应的表
    107     NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Movie"];
    108    
    109     //2设置过滤条件
    110     request.predicate = [NSPredicate predicateWithFormat:@"rating = 3.6"];
    111    
    112     //3.查询数据
    113     NSArray *result = [manageObjectContext executeFetchRequest:request error:nil];
    114    
    115     //4.遍历查询到的数据
    116     for (Movie *m in result) {
    117        
    118         /* 更新查询到的电影信息
    119          m.rating = @8.2;
    120         
    121          NSLog(@"标题:%@,时间:%@,评分:%@",m.title,m.year,m.rating);
    122          */
    123        
    124         //删除查询到的电影信息
    125         [manageObjectContext deleteObject:m];
    126     }
    127    
    128     //5.保存数据
    129     BOOL isSuccess = [manageObjectContext save:nil];
    130 
    131     if (isSuccess) {
    132         NSLog(@"更新数据成功!");
    133     }
    134     else{
    135         NSLog(@"更新数据失败!");
    136        
    137     }
    138    
    139 }
    140 
    141 
    142 //删除数据  删除查询到的电影信息数据
    143 - (IBAction)deleteAction:(id)sender {
    144    
    145    
    146    // [manageObjectContext deleteObject:<#(NSManagedObject *)#>];
    147 }
    148 
    149 
    150 //查询数据 request
    151 - (IBAction)queryAction:(id)sender {
    152    
    153     //1.创建请求对象,请求对应的表
    154     NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Movie"];
    155    
    156     //2.使用谓词设置过滤条件
    157    
    158     /*
    159     // 注意条件参数的单引号
    160     NSString *str = [NSString stringWithFormat:@"title = '%@'",@"金刚狼"];
    161     request.predicate = [NSPredicate predicateWithFormat:str];
    162     */
    163    
    164     //3.模糊查询
    165     NSString *str = [NSString stringWithFormat:@"title like '%@'",@"*q*"];
    166     request.predicate = [NSPredicate predicateWithFormat:str];
    167    
    168    
    169     //4.设置排序
    170     NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"self.rating" ascending:YES];
    171     request.sortDescriptors = @[sortDescriptor];
    172    
    173     //5.设置分页查询
    174     request.fetchOffset = 0;   //设置起始位置
    175     request.fetchLimit = 3;     //设置查询的数据条数
    176    
    177     //6.查询数据
    178     NSArray *result = [manageObjectContext executeFetchRequest:request error:nil];
    179     for (Movie *m in result) {
    180        
    181         NSLog(@"标题:%@,时间:%@,评分:%@",m.title,m.year,m.rating);
    182     }
    183 
    184 }
  • 相关阅读:
    C#获取windos 登录用户信息
    像我这样的人
    只道情深,奈何缘浅(雪之轻裳搜集)
    如果我死了,还剩下什么(雪之轻裳)
    嫁给爱情 还是嫁给现实(搜集)
    排名前 16 的 Java 工具类
    java 获取当前屏幕截图
    转:零售数据观(一):如何花30分钟成为一个标签设计“达人”
    转:数据指标系列:电商数据分析指标体系总结V1.0
    转:领域模型中的实体类分为四种类型:VO、DTO、DO、PO
  • 原文地址:https://www.cnblogs.com/pengsi/p/4860147.html
Copyright © 2020-2023  润新知