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 ...
随机推荐
- ORACLE视图添加备注
ORACLE视图添加备注 版权声明:本文为博主原创文章,未经博主允许不得转载. create or replace view oes_material_series_ref as select t.p ...
- Linux-手动释放缓存(Buffer、Cache)
/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段.也就是说可以通过修改/proc中的文件,来对 当前kernel的行为做出调整.那么我们可以通过调整/ ...
- COCOS2d-x简易安装步骤
准备工作:1. 下载 cocos2d-x 下载地址:http://cdn.cocos2d-x.org/cocos2d-x-2.2.zip2. 下载 python 2.7.3 下载地址:h ...
- Hibernate 数据的批量插入、更新和删除
4.2 Hibernate的批量处理 Hibernate完全以面向对象的方式来操作数据库,当程序里以面向对象的方式操作持久化对象时,将被自动转换为对数据库的操作.例如调用Session的delete ...
- Linux一键安装web环境全攻略(阿里云服务器)
摘自阿里云服务器官网,此处 一键安装包下载: 点此下载 安装须知 1.此安装包可在阿里云所有linux系统上部署安装,此安装包包含的软件及版本为: nginx:1.0.15.1.2.5.1.4.4 a ...
- #include <thread>
1 detach 脱离当前主线程,自由执行,乱序; 2 join() 等待模式,执行完再执行下一个 3 std::this_thread::get_id() 获取当前线程编号 4 std::threa ...
- 链表-remove duplicates from sorted list
struct ListNode* deleteDuplicates(struct ListNode* head) { struct ListNode *p=head; if(!head) return ...
- ToDoList-学习中看到的知识盲点
1. java中的volatile关键字的作用 2. java类加载器 3. Android源码编译 4. MediaPlayer的用法 5. Html5和web app
- 字符串分割--Java中String.split()用法
转载自:http://blog.163.com/zs_note/blog/static/199386112201110804233558/ 在java.lang包中有String.split()方法, ...
- 【转】iOS隐藏导航条1px的底部横线
默认情况下会有这条线 第一种方法: 1 2 3 4 5 6 UINavigationBar *navigationBar = self.navigationController.navigationB ...