一、概念
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 }
时间: 2024-10-31 03:16:28