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);
}
} }

CoreData总结的更多相关文章

  1. iOS基本数据库存储方式 - CoreData

    CoreData 创建模型文件的过程 1.选择模板 2.添加实体 3.添加实体的属性[注意]属性的首字母必须小写 一.CoreData管理类(必备以下三个类对象) 1.CoreData数据操作的上下文 ...

  2. iOS CoreData 中 objectID 的不变性

    关于 CoreData的 objectID 官方文档有这样的表述:新建的Object还没保存到持久化存储上,那么它的objectID是临时id,而保存之后,就是持久化的id,不会再变化了. 那么,我想 ...

  3. CoreData __ 基本原理

    操作过程 Context想要获取值,先要告诉连接器,我要什么东西 链接器再告诉store, 你给我什么东西, store去找 找到之后返回给链接器,链接器再返回给Context          Co ...

  4. iOS CoreData primitive accessor

    Given an entity with an attribute firstName, Core Data automatically generates firstName, setFirstNa ...

  5. 初识CoreData与详解

    Core Data数据持久化是对SQLite的一个升级,它是iOS集成的,在说Core Data之前,我们先说说在CoreData中使用的几个类. (1)NSManagedObjectModel(被管 ...

  6. CoreData教程

    网上关于CoreData的教程能搜到不少,但很多都是点到即止,真正实用的部分都没有讲到,而基本不需要的地方又讲了太多,所以我打算根据我的使用情况写这么一篇实用教程.内容将包括:创建entity.创建r ...

  7. CoreData和SQLite多线程访问时的线程安全

    关于CoreData和SQLite多线程访问时的线程安全问题 数据库读取操作一般都是多线程访问的.在对数据进行读取时,我们要保证其当前状态不能被修改,即读取时加锁,否则就会出现数据错误混乱.IOS中常 ...

  8. IOS数据存储之CoreData使用优缺点

    前言: 学习了Sqlite数据之后认真思考了一下,对于已经习惯使用orm数据库的开发者或者对sql语句小白的开发者来说该如何做好数据库开发呢?这个上网搜了一下?看来总李多虑了!apple 提供了一种数 ...

  9. iOS开发之表视图爱上CoreData

    在接触到CoreData时,感觉就是苹果封装的一个ORM.CoreData负责在Model的实体和sqllite建立关联,数据模型的实体类就相当于Java中的JavaBean, 而CoreData的功 ...

  10. CoreData

    之前在学习使用SQLite时, 需要编写大量的sql语句,完成数据的增删改查,但对于不熟悉sql语句的开发人员来说,难度较大,调试程序比较困难. 由此出现CoreData框架,将sql的操作转换成为对 ...

随机推荐

  1. DB2 中文排序问题

    本地测试库中 代码集: GBK 数据库配置发行版级别 = 0x0c00 数据库发行版级别 = 0x0c00 数据库地域 = CN 数据库代码页 = 1386 数据库代码集 = GBK 数据库国家/地区 ...

  2. 《舌尖上的中国》第二季今日首播了,天猫食品也跟着首发,借力使力[bubuko.com]

    天猫旗下的天猫食品与央视CCTV-1栏目<舌尖上的中国>第二季(以下简称“舌尖2”)达成合作,天猫食品成为舌尖2独家合作平台,同步首发每期 节目中的食材和美食菜谱,舌尖2摄制组还将为同步上 ...

  3. IOS零碎技术整理(1)-后台运行

    这两天做关于离线通知的功能,总结了一点关于这方面的注意点:按Home键回到桌面后程序很快被挂起,系统将关闭程序的Socket监听,此时程序将不能继续执行网络请求等操作. 两种方式可以使程序继续存活一段 ...

  4. WebApi 学习随笔(一)

    引用MSDN: ASP.NET Web API is a framework that makes it easy to build HTTP services that reach a broad ...

  5. SpringMvc JSON 406,吐血。。。。

    解决方法一: 1.导入jackson-core-2.5.1.jar和jackson-databind-2.5.1.jar 2.Spring配置文件添加: 1 spring3为:org.springfr ...

  6. (转)RVA-相对虚拟地址解释

    RVA是相对虚拟地址(Relative Virtual Address)的缩写,顾名思义,它是一个“相对”地址,也可以说是“偏移量”,PE文件的各种数据结构中涉及到地址的字段大部分都是以RVA表示的. ...

  7. javascript slice

    定义和用法 slice() 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分. 语法 stringObject.slice(start,end) 参数 描述 start 要抽取的片断的起始下 ...

  8. 用ADO.NET存入数据库

    点击按钮存入登录名和密码: const string connstr = @"data source=USER-20160705UW\JSQL;initial catalog=Test;in ...

  9. Balloons(山东省第一届ACM省赛)

    Balloons Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Both Saya and Kudo like balloons ...

  10. Google Developing for Android 三 - Performance最佳实践

    Google Developing for Android 三 - Performance最佳实践 发表于 2015-06-07   |   分类于 Android最佳实践 原文 Developing ...