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 }
原文地址:https://www.cnblogs.com/pengsi/p/4860147.html