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学习笔记的更多相关文章

  1. 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移

    不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ...

  2. Orleans[NET Core 3.1] 学习笔记(四)( 2 )获取Grain的方式

    简介 在这一节,我们将介绍如何在Silo和Client中获取Grain及调用Grain Grain获取方式 从Grain内部获取: //根据特定的Key值创建或获取指定的Grain IStudent ...

  3. ASP.NET Core Web开发学习笔记-1介绍篇

    ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...

  4. Core Data stack

    https://developer.apple.com/library/content/documentation/DataManagement/Devpedia-CoreData/coreDataS ...

  5. Orleans[NET Core 3.1] 学习笔记(四)( 1 )创建项目

    ClassRoom ClassRoom是一个练手demo,目的是为了能熟悉掌握Orleans的基本知识和使用方法,我会尽量在这个项目中加入更多的知识点,一边学一边练避免我看完文档就忘掉 创建项目 依旧 ...

  6. Orleans[NET Core 3.1] 学习笔记(三)( 3 )服务端配置

    服务端配置 Silo通过SiloHostBuilder和许多补充选项类以编程方式进行配置. Silo配置有几个关键方面: Orleans集群信息 集群提供程序(不知道咋翻译) Silo到Silo和Cl ...

  7. Orleans[NET Core 3.1] 学习笔记(三)( 2 )客户端配置

    客户端配置 通过一个ClientBuilder和多个补充选项类,以编程方式配置一个用于连接Silo集群并将请求发送至Grain的客户端. 客户端配置示例: var client = new Clien ...

  8. Orleans[NET Core 3.1] 学习笔记(三)( 1 )本地开发配置

    本地开发配置 本地开发和调试的时候,我们可能不需要去关注集群和网络ip端口.所以对于本地开发模式,Orleans给了我们比较简单的配置方式. Silo配置 在本地开发的配置模式下,Orleans会默认 ...

  9. Orleans[NET Core 3.1] 学习笔记(二)Hello World

    项目结构 开始Orleans之前,我们都知道Orleans主要可以分为俩部分,Host和Client. 所以我们可以创建如下的项目结构: IGrain 一个包含Grain接口的库(.NET Stand ...

随机推荐

  1. ORACLE视图添加备注

    ORACLE视图添加备注 版权声明:本文为博主原创文章,未经博主允许不得转载. create or replace view oes_material_series_ref as select t.p ...

  2. Linux-手动释放缓存(Buffer、Cache)

    /proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段.也就是说可以通过修改/proc中的文件,来对 当前kernel的行为做出调整.那么我们可以通过调整/ ...

  3. COCOS2d-x简易安装步骤

    准备工作:1.    下载 cocos2d-x  下载地址:http://cdn.cocos2d-x.org/cocos2d-x-2.2.zip2.    下载 python 2.7.3 下载地址:h ...

  4. Hibernate 数据的批量插入、更新和删除

    4.2  Hibernate的批量处理 Hibernate完全以面向对象的方式来操作数据库,当程序里以面向对象的方式操作持久化对象时,将被自动转换为对数据库的操作.例如调用Session的delete ...

  5. Linux一键安装web环境全攻略(阿里云服务器)

    摘自阿里云服务器官网,此处 一键安装包下载: 点此下载 安装须知 1.此安装包可在阿里云所有linux系统上部署安装,此安装包包含的软件及版本为: nginx:1.0.15.1.2.5.1.4.4 a ...

  6. #include <thread>

    1 detach 脱离当前主线程,自由执行,乱序; 2 join() 等待模式,执行完再执行下一个 3 std::this_thread::get_id() 获取当前线程编号 4 std::threa ...

  7. 链表-remove duplicates from sorted list

    struct ListNode* deleteDuplicates(struct ListNode* head) { struct ListNode *p=head; if(!head) return ...

  8. ToDoList-学习中看到的知识盲点

    1. java中的volatile关键字的作用 2. java类加载器 3. Android源码编译 4. MediaPlayer的用法 5. Html5和web app

  9. 字符串分割--Java中String.split()用法

    转载自:http://blog.163.com/zs_note/blog/static/199386112201110804233558/ 在java.lang包中有String.split()方法, ...

  10. 【转】iOS隐藏导航条1px的底部横线

    默认情况下会有这条线 第一种方法: 1 2 3 4 5 6 UINavigationBar *navigationBar = self.navigationController.navigationB ...