Core Data,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,我们不需要编写任何SQL语句,这个有点类似于著名的Hibernate持久化框架

//参与对数据操作的全过程,监测数据对象的变化,以提供对undo/redo的支持及更新绑定到数据额UI

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;

//用来描述应用程序的数据模型,包含实体,特性,读取请求

@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;

//相当于数据文件管理器,处理底层的对文件的读取和写入,一般无需跟他打交道

@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

1.应用程序先创建或者读取模型文件,生成NSManagedObjectModel对象

2. NSManagedObjectContext调用NSPersistentStoreCoordinator对数据文件进行读写

3. NSPersistentStoreCoordinator负责从数据文件中读取,生成ManagedObject,或者保存ManagedObject对象

4. NSManagedObjectContext参与对数据各种操作的整个过程

5.各种Controller,用来可视化的操作数据库对象

打开数据库的封装方法 

/**
* 打开数据库
*/
- (void)openDB
{
//创建数据库
//1.将所有的实例化模型(将所有的数据模型全部加进来)
NSManagedObjectModel * model = [NSManagedObjectModel mergedModelFromBundles:nil];
//单个添加
// NSURL * url = [[NSBundle mainBundle] URLForResource:@"CoreDataHandle" withExtension:@"momd"];
// NSManagedObjectModel * model2 = [[NSManagedObjectModel alloc] initWithContentsOfURL:url]; //2.实例化存储调度,建立起桥梁,需要模型
NSPersistentStoreCoordinator * store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; //3.添加一个持久化的数据库到存储调度
//3.1 建立数据保存的沙盒路径所对应的URL
NSString * path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"my.sqlite"]; NSURL * url = [NSURL fileURLWithPath:path]; //3.2打开数据库,或者新建文件(如果数据库不存在,那么新建文件)
NSError * error = nil;
//下面options的两个参数是版本迁移的两个参数
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:@{NSMigratePersistentStoresAutomaticallyOption:@YES,NSInferMappingModelAutomaticallyOption:@YES} error:&error];
if (error) {
NSLog(@"数据库打开出错:%@",error.localizedDescription);
}
else
{
NSLog(@"数据库打开成功");
self.managedObjectContext = [[NSManagedObjectContext alloc] init];
self.managedObjectContext.persistentStoreCoordinator = store;
} }

谓词的使用方法举例

/**
* 查询所有用户记录
*/
- (void)allPersons
{
// 1. 实例化一个查询(Fetch)请求
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"]; // 条件查询,通过谓词来实现的
// request.predicate = [NSPredicate predicateWithFormat:@"age < 60 && name LIKE '*五'"];
// 在谓词中CONTAINS类似于数据库的 LIKE '%王%'
// request.predicate = [NSPredicate predicateWithFormat:@"phoneNo CONTAINS '1'"];
// 如果要通过key path查询字段,需要使用%K
// request.predicate = [NSPredicate predicateWithFormat:@"%K CONTAINS '1'", @"phoneNo"];
// 直接查询字表中的条件 // 2. 让_context执行查询数据
NSArray *array = [_context executeFetchRequest:request error:nil]; for (Person *p in array) {
NSLog(@"%@ %@ %@", p.name, p.age, p.phoneNo); // 在CoreData中,查询是懒加载的
// 在CoreData本身的SQL查询中,是不使用JOIN的,不需要外键
// 这种方式的优点是:内存占用相对较小,但是磁盘读写的频率会较高
for (Book *b in p.books) {
NSLog(@"%@ %@ %@", b.name, b.price, b.author);
}
} }

最新文章

  1. 6周学习计划,攻克JavaScript难关(React/Redux/ES6 etc.)
  2. ArcSoft&#39;s Office Rearrangement---hdu5933
  3. OpenJudge 2809 计算2的N次方
  4. hdu 4666 最大曼哈顿距离
  5. 在地图上添加POI
  6. vim Diff,Easy,Read-Only 的区别
  7. C++ Primer 学习笔记_98_特殊的工具和技术 --优化内存分配
  8. [国嵌攻略][107][Linux进程管理子系统]
  9. SQL Server中sp_spaceused统计数据使用的空间总量不正确的原因
  10. # 2019-2020.3 《java程序设计》第一周学习总结
  11. dhtmlxtree 如何得到xml,json等文件中的自定义的属性值
  12. SNF快速开发平台MVC-EasyUI3.9之-WebApi和MVC-controller层接收的json字符串的取值方法和调用后台服务方法
  13. 推送证书p12文件转换成pem的命令
  14. JTAG TAP Controller
  15. spring中 context:property-placeholder 导入多个独立的 .properties配置文件
  16. Android Error: This attribute must be localized.
  17. Kafka消息重新发送
  18. ArcGIS中国工具(ArcGISCTools)2.0正式发布
  19. July 14th 2017 Week 28th Friday
  20. python多线程的适用场景

热门文章

  1. 044. asp.net主题之二为主题添加CSS样式和动态加载主题
  2. python海龟图制作
  3. 轻量级Lua IDE ZeroBrane Studio 的使用技巧和汉化
  4. win7 64位 VS2010调试提示&ldquo;ORA-12154: TNS: 无法解析指定的连接标识符&rdquo;的解决方法
  5. Linux 编译ACE
  6. if、if elif判断
  7. 从零到有的lex学习
  8. 每天一个 Linux 命令(22):find 命令的参数详解
  9. javascript事件执行流程分析
  10. JNI相关知识