Core Data Stack学习笔记
Entity Entities 实体->数据表
一个实体可以表示一个数据模型
1> 通过图形化界面可以建立一个模型关系图,可以指定一对多,多对一,多对多的数据关系
-在数据库开发中,少用多对多关系
2> 通过工具能够自动生成对应的模型文件
3> 数据保存
NSManagedObject 被管理的对象
-开发中设计的实体,本身都是被管理对象的子类
使用CoreData的一个注意事项:如果开发时,修改过数据模型,最好将沙盒中的数据库文件删除!
使用CoreData开发的步骤
1. 首先创建一个Model,利用图形化界面创建各个实体模型
-创建完成之后,通过工具可以自动生成模型文件
-如果修改模型后,可以再次生成模型文件,会覆盖掉之前生成的文件
-自动生成的模型文件,一般不要进去改!
2. 代码
-实例化模型
-使用模型实例化持久化存储调度器
-指定存储调度器保存数据的类型以及路径
-实例化被管理对象的上下文,指定调度器
以上四步代码,在Xcode6已经封装好,可以直接使用,一般不需要程序员编写!
已经使用单例封装,可以直接调用,代码如下:
单例的.h文件
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h> @interface CZCoreDataTools : NSObject + (instancetype)sharedCoreDataTools; /**
* 使用模型名称&数据库名称初始化Core Data Stack
*/
- (void)setupCoreDataWithModelName:(NSString *)modelName dbName:(NSString *)dbName; /**
* 被管理对象的上下文
*/
@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext; /**
* 保存上下文
*/
- (void)saveContext; @end
单例的.m文件
#import "CZCoreDataTools.h"
@implementation CZCoreDataTools
+ (instancetype)sharedCoreDataTools {
static CZCoreDataTools *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
// 问题:单例我们希望被广泛使用,不能确定模型的名称,同时数据库的文件名也不确定
- (void)setupCoreDataWithModelName:(NSString *)modelName dbName:(NSString *)dbName {
// 1. 实例化数据模型
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:modelName withExtension:@"momd"];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
// 2. 实例化持久化存储调度器
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
// 3. 指定保存的数据库文件,以及类型
// 数据库保存的URL
NSString *dbPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
dbPath = [dbPath stringByAppendingPathComponent:dbName];
NSURL *dbURL = [NSURL fileURLWithPath:dbPath];
[psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:dbURL options:nil error:NULL];
// 4. 被管理对象的上下文
_managedObjectContext = [[NSManagedObjectContext alloc] init];
// 指定上下文的持久化调度
[_managedObjectContext setPersistentStoreCoordinator:psc];
}
- (void)saveContext {
[self.managedObjectContext save:NULL];
}
@end
// 程序启动时 初始化Core Data Stack
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 初始化数据库
[[CZCoreDataTools sharedCoreDataTools] setupCoreDataWithModelName:@"Model" dbName:@"my.db"];
return YES;
}
3. NSEntityDescription实体描述对象,用来描述一个实体
使用方法,如果要新建一条记录,需要使用实体描述对象
// 表示要插入一条记录
// 插入Person实体描述的记录
// 插入之后,实体信息在context中维护
// 返回一个指定实体名称对应数据模型
[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.appDelegate.managedObjectContext];
// 设置模型属性
// 通知持久化数据调度器,保存数据
[self.managedObjectContext save:NULL];
提示:如果有多个实体关系,可以直接通过属性设置,就能够实现底层数据表的多表级联
程序员不需要关心底层数据库的任何实现细节
4. 在Core Data中查询数据
所有的查询是由 NSFetchedResultsController 来控制的
-首先指定”要查询的实体”以及排序的属性名称
-指定查询控制器的代理
-实现监听方法
-当要查询的实体记录发生变化,就会自动执行代理方法
在代理方法中,直接实现刷新数据工作即可
-需要查询的时候执行 performFetch:,就可以使用已经设置好的查询请求,查询数据
NSFetchedResultsController的fetchedObjects属性中保存了所有查询出来的”要查询实体”的数组
参考代码:
// 1. 查询请求
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
// 2. 排序
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"personName" ascending:YES];
request.sortDescriptors = @[sort]; // 3. 设置搜索条件 - 谓词 (am, is, are) 用来定义一个物体的
// 在OC的开发中,通常使用谓词来过滤数据集
NSPredicate *p = [NSPredicate predicateWithFormat:@"personName CONTAINS %@ || company.compayName CONTAINS %@", text, text];
request.predicate = p; _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:[CZCoreDataTools sharedCoreDataTools].managedObjectContext sectionNameKeyPath:nil cacheName:nil]; // 设置代理
_fetchedResultsController.delegate = self;
Core Data Stack学习笔记的更多相关文章
- 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移
不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ...
- Orleans[NET Core 3.1] 学习笔记(四)( 2 )获取Grain的方式
简介 在这一节,我们将介绍如何在Silo和Client中获取Grain及调用Grain Grain获取方式 从Grain内部获取: //根据特定的Key值创建或获取指定的Grain IStudent ...
- ASP.NET Core Web开发学习笔记-1介绍篇
ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...
- Core Data stack
https://developer.apple.com/library/content/documentation/DataManagement/Devpedia-CoreData/coreDataS ...
- Orleans[NET Core 3.1] 学习笔记(四)( 1 )创建项目
ClassRoom ClassRoom是一个练手demo,目的是为了能熟悉掌握Orleans的基本知识和使用方法,我会尽量在这个项目中加入更多的知识点,一边学一边练避免我看完文档就忘掉 创建项目 依旧 ...
- Orleans[NET Core 3.1] 学习笔记(三)( 3 )服务端配置
服务端配置 Silo通过SiloHostBuilder和许多补充选项类以编程方式进行配置. Silo配置有几个关键方面: Orleans集群信息 集群提供程序(不知道咋翻译) Silo到Silo和Cl ...
- Orleans[NET Core 3.1] 学习笔记(三)( 2 )客户端配置
客户端配置 通过一个ClientBuilder和多个补充选项类,以编程方式配置一个用于连接Silo集群并将请求发送至Grain的客户端. 客户端配置示例: var client = new Clien ...
- Orleans[NET Core 3.1] 学习笔记(三)( 1 )本地开发配置
本地开发配置 本地开发和调试的时候,我们可能不需要去关注集群和网络ip端口.所以对于本地开发模式,Orleans给了我们比较简单的配置方式. Silo配置 在本地开发的配置模式下,Orleans会默认 ...
- Orleans[NET Core 3.1] 学习笔记(二)Hello World
项目结构 开始Orleans之前,我们都知道Orleans主要可以分为俩部分,Host和Client. 所以我们可以创建如下的项目结构: IGrain 一个包含Grain接口的库(.NET Stand ...
随机推荐
- WEB Application Development Integrator : 应用设置
1.1. 系统安装 应用 Oracle EBS WEB Application Development Integrator WEB ADI在Oracle EBS 11.5.10.* 版本 ...
- lint使用简介
LINT工具是一种软件质量保证工具,许多国外的大型专业软件公司,如微软公司,都把它作为程序检查工具,在程序合入正试版本或交付测试之前一定要保证通过了LINT检查,他们要求软件工程师在使用LINT时要打 ...
- discuz函数quote
public static function quote($str, $noarray = false) { if (is_string($str)) return '\'' . addcslashe ...
- Oracle Dataguard HA (主备,灾备)方案部署调试
包括: centos6.5 oracle11gR2 DataGuard安装 dataGuard 主备switchover角色切换 数据同步测试 <一,>DG数据库数据同步测试1,正常启动主 ...
- python-大话装饰器
装饰器 装饰器是个什么玩意呢?是个会了不难,装逼神器.但是如果不了解理解起来还是很抽象,让我们试试这个装逼神器吧! 1.什么是装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典 ...
- Swift语法总结(精简版)
第一部分: 1. Swift简介 2010年的夏天,苹果公司的开发人员Chris Lattne接到了一个特别的任务,为OS X 和iOS平台开发下一代的编程语言,也就是Swift. 苹果公司于2014 ...
- B树、B-树、B+树、B*树都是什么(转)
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于 ...
- BZOJ 2716 Violet 3 天使玩偶 CDQ分治
题目大意:初始给定平面上的一个点集.提供两种操作: 1.将一个点增加点集 2.查询距离一个点最小的曼哈顿距离 K-D树是啥...不会写... 我仅仅会CDQ分治 对于一个询问,查询的点与这个点的位置关 ...
- JavaScript引用类型之Array数组之强大的splice()方法
splice()方法可以说是Array数组最强大的方法,他的用法很多,主要用法是向数组的中部插入项! 下面是它的用法: arrayObject.splice(index,howmany,element ...
- JavaScript引用类型之Object类型
在JavaScript中大多数的引用类型都是Object的实例,Object类型也是使用最多的类型! 创建Object类型实例的方式有两种,下面分别来分析一下: (1)第一种是使用new操作符后跟Ob ...