NSManagedObject:模型对象,或者叫实体(entity),可理解为OC里的对象。sql
NSManagedObjectModel:模型文件(.xcdatamodeld),记录全部的模型对象及对象的属性数据库
一、应用程序先建立或读取模型文件(后缀为xcdatamodeld)生成 NSManagedObjectModel 对象。 Document应⽤程序是通常是经过 NSDocument 或其子类 NSPersistentDocument)从模型文件(后缀为 xcdatamodeld)读取。
二、而后⽣成 NSManagedObjectContext 和 NSPersistentStoreCoordinator 对象,前者对用户透明地调用后 者对数据文件进行读写。app
三、NSPersistentStoreCoordinator 负责从数据文件(xml, sqlite,⼆进制⽂件等)中读取数据⽣成 Managed Object,或保存 Managed Object 写入数据⽂文件。
四、NSManagedObjectContext 参与对数据进行各类操做的整个过程,它持有 Managed Object。咱们经过它 来监测 Managed Object。监测数据对象有两个做⽤:支持 undo/redo 以及数据绑定。这个类是最常被⽤用到 的。框架
五、Array Controller, Object Controller, Tree Controller 这些控制器⼀般与 NSManagedObjectContext 关联, 所以咱们能够经过它们在 nib 中可视化地操做数据对象。fetch
2、Core Data的使用spa
按如下步骤:代理
按如下步骤:code
生成上下文, 关联模型文件生成数据库orm
导入头文件 #import <CoreData/CoreData.h>
sqlite
1.初始化NSManagedObjectModel对象, 加载模型文件, 读取app中的全部实体信息;
2.初始化NSPersistentStoreCoordinator对象, 添加持久化库(这里采起SQLite数据库);
3.初始化NSManagedObjectContext对象, 拿到这个上下文对象操做实体, 进行CRUD操做.
得到AppDelegate的代理对象
AppDelegate *delegate = [UIApplication sharedApplication].delegate;
添加实体对象
// 建立实体对象 // NSEntityDescription *entity = [NSEntityDescription entityForName:@"User" inManagedObjectContext:delegate.managedObjectContext]; //添加一个实体对象到 managedObjectContext 中 User *user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:delegate.managedObjectContext]; user.userID = @10002; user.userName = @"怀化"; user.userAge = @30; user.userSex = @"男"; user.userDate = [NSDate date];
保存上下文:
[delegate saveContext];
建立一个取值请求:
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"];
使用谓词设置查询条件:
request.predicate = [NSPredicate predicateWithFormat:@"userAge < 35"]; request.predicate = [NSPredicate predicateWithFormat:@"userName LIKE '*杨*'"];
设置查询的条数:
request.fetchLimit = 2;
指定从某个位置开始查询(分页效果)
request.fetchOffset = 2;
按某个字段升序、降序排列(YES为升序,NO为降序)
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"userAge" ascending:YES]; request.sortDescriptors = @[sort];
在上下文中执行取值请求:
NSArray *objects = [delegate.managedObjectContext executeFetchRequest:request error:&error]; [objects enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { User *user = (User *)obj; NSLog(@"%@ %@ %@ %@ %@",user.userID, user.userName, user.userAge, user.userSex, user.userDate); }];
以下NSFetchRequest 经常使用方法:
-setEntity: | 设置你要查询的数据对象的类型(Entity) |
-setPredicate: | 设置查询条件 |
-setFetchLimit: | 设置最大查询对象数目 |
-setSortDescriptors: | 设置查询结果的排序方法 |
-setAffectedStores: | 设置能够在哪些数据存储中查询 |
查询:
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"]; request.predicate = [NSPredicate predicateWithFormat:@"userID == '10005'"]; NSArray *objects = [delegate.managedObjectContext executeFetchRequest:request error:nil];
修改:
[objects enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { User *user = (User *)obj; user.userDate = [NSDate date]; //保存 [delegate saveContext]; }
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"]; request.predicate = [NSPredicate predicateWithFormat:@"userID == '10005'"]; NSArray *objects = [delegate.managedObjectContext executeFetchRequest:request error:nil]; [objects enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { //删除 [delegate.managedObjectContext deleteObject:obj]; // 保存 [delegate saveContext]; }];