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. c语言libcurl 使用实例get/post方法+c语言字符串处理

    #include <stdio.h> #include <curl/curl.h> #include <string.h> #include <ctype.h ...

  2. oracle初始安装大小

    oracle初始安装大小 /ruiy/ocr/DBSoftware/app/oracle/ruiy/ocr/DBSoftware/app/oraInventory/ruiy/ocr/DBData/or ...

  3. Java单态模式

    Java的单态模式 Singletom 作用:保证在Java应用程序中,一个Java类只有一个实例存在:所以一般单态类会提供一个返回该类实例的方法.提供一个对对象的全局访问指针. 优点:节省内存,限制 ...

  4. CSS定位深入理解 完全掌握CSS定位 相对定位和绝对定位

    其实前面的标准流和浮动流都很理解,就是定位不太好理解,特别是相对定位和绝对定位,很多刚开始学的同学不好区分.因此这里,小强老师和大家一起分享CSS定位的学习. 通过我们前面的学习,我们网页布局方法: ...

  5. (转)eclipse 启动参数介绍(如添加插件时,如果不显示,则使用eclipse -clean启动)

    本文转载自:http://hi.baidu.com/dd_taiyangxue/blog/item/08950f3991b4e8c9d46225c8.html 其实,Eclipse是一个可以进行非常灵 ...

  6. Deep Learning(深度学习)学习笔记整理系列之(二)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  7. SQL 处理空值

    问题: 在数据库中经常会有为null和''的值的列,在查询的时候,我们需要将它们转化成有效的值. 解决方案: 在emp表中的comm注释有的为null有的为'',在查询的时候 我们希望没有注释的显示为 ...

  8. Aprori算法[关联规则算法]

    <meta http-equiv="Content-Type" content="text/html; charset=GBK" /> <?p ...

  9. mysql 特殊语句

    1.获取下当前mysql的插件目录select @@plugin_dir 2.mysql移动文件 select load_file('文件路径') into dumpfile '导出路径' 3.des ...

  10. JAVA和.NET互调用

    通过接口实现JAVA和.NET互调用-JNInterface 使用C#编程多年,也十分感激微软在语言架构.语法糖.编辑器等方面给自己带来的便利.但因为最近工作中有接触到JAVA,渐渐地发现的确像大家说 ...