服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS App开发中Core Data框架基本的数据管理功能小结

iOS App开发中Core Data框架基本的数据管理功能小结

2021-01-20 16:37珲少 IOS

除了使用SQL关系型数据库,我们还可以使用Xcode中提供的Core Data来进行表结构数据处理,这里我们就来初步整理iOS App开发中Core Data框架基本的数据管理功能小结:

一、何为coredata
coredata是一个专门用来管理数据的框架,其在性能与书写方便上都有很大的优势,在数据库管理方面,apple强烈推荐开发者使用coredata框架,在apple的官方文档中称,使用coredata框架可以减少开发者50%——70%的代码量,这虽然有些夸张,但由此可见,coredata的确十分强大。

二、设计数据模型
在ios开发中,时常使用sql数据库对大量的表结构数据进行处理,但是sql有一个十分明显的缺陷,对于常规数据模型的表,其处理起来是没问题的,例如一个班级表,其中每条数据中有班级名称,人数这样的属性,一个学生表,其中每条数据有学生的姓名,性别,年龄这样的属性。但是如果要在表与表之间建立联系,自定义对象与自定义对象之间产生从属关系,使用sql处理起来就十分麻烦了,例如如果这个班级表中有一个班长的属性,这个属性是一个学生类型。
1.创建实体类型及其属性
使用xcode创建一个工程,在工程中新建一个文件,选择core data分类中的datamodel创建,如下图:

iOS App开发中Core Data框架基本的数据管理功能小结

这时在xcode的文件导航区会出现一个以xcdatamodeld为扩展名的文件,这个文件就是数据模型文件,点击add entity按钮添加一个实体类型,取名为schoolclass,为这个类型添加两个属性,分别为名字name和学生数量stunum,如下图:

iOS App开发中Core Data框架基本的数据管理功能小结

 

2.对实体类型进行设置
在xcode右侧的工具栏中可以对实体类型进行一些设置,选中一个实体类型,如下图:

iOS App开发中Core Data框架基本的数据管理功能小结

name设置实体类型的名称,abstract entity设置是否是抽象实体,如果勾选,则此实体不能被实例化,只能被继承,类似于抽象类,比如定义人为一个实体类型,在定义继承于人实体类型的老师、学生等来进行实例化。parent entity用来选择父类实体,class用于设置对应的类的。

3.在实体对象之间建立关系
再创建一个学生类实体student,添加name和age两个属性。选中schoolclass,在其中的relationships模块中点击+号,来添加一个关系,如下图:

iOS App开发中Core Data框架基本的数据管理功能小结

这时,schoolclass实体类型中就有了一个student类型的班长属性。如果切换一下编辑风格,可以更加清晰的看到实体类型之间的关系,如下图:

iOS App开发中Core Data框架基本的数据管理功能小结

 

4.对属性和关系进行设置
选中一个属性或者关系,在右侧的工具栏中可以对属性进行一些设置,如下图:

iOS App开发中Core Data框架基本的数据管理功能小结

name设置属性的名字,optional类型代表可选,即在实例化对象时可以赋值也可以不赋值。attribute设置属性的数据类型,default value设置数据的默认值。
二、数据模型管理类nsmanagedobjectmodel

通过nsmanagedobjectmodel,可以将创建的数据模型文件读取为模型管理类对象,使用如下方法:
//获取.xcdatamodeld文件url
nsurl *modelurl = [[nsbundle mainbundle]urlforresource:@"model" withextension:@"momd"];
//读取文件
nsmanagedobjectmodel * mom = [[nsmanagedobjectmodel alloc]initwithcontentsofurl:modelurl];

其中还有一些属性和方法进行数据模型的管理:

//将多个数据模型管理文件进行合并
+ (nullable nsmanagedobjectmodel *)mergedmodelfrombundles:(nullable nsarray<nsbundle *> *)bundles; 
//将多个数据模型管理类对象进行合并
+ (nullable nsmanagedobjectmodel *)modelbymergingmodels:(nullable nsarray<nsmanagedobjectmodel *> *)models;
//存放数据中所有实体模型的字典 字典中是实体名和实体描述对象
@property (readonly, copy) nsdictionary<nsstring *, nsentitydescription *> *entitiesbyname;
//存放数据中所有实体描述对象
@property (strong) nsarray<nsentitydescription *> *entities;
//返回所有可用的配置名称
@property (readonly, strong) nsarray<nsstring *> *configurations;
//获取关联某个配置的所有实体
- (nullable nsarray<nsentitydescription *> *)entitiesforconfiguration:(nullable nsstring *)configuration;
//为某个实体关联配置
- (void)setentities:(nsarray<nsentitydescription *> *)entities forconfiguration:(nsstring *)configuration;
//创建请求模板
- (void)setfetchrequesttemplate:(nullable nsfetchrequest *)fetchrequesttemplate forname:(nsstring *)name;
//获取请求模板
- (nullable nsfetchrequest *)fetchrequesttemplateforname:(nsstring *)name;

关于实体描述对象nsentitydescription:

实体类似于数据库中的表结构,例如上次我们创建的班级实体模型,一个实体模型中可以添加许多属性与关系,nsentitydescription对象中存放这些信息,常用如下:

//实体所在的模型管理对象
@property (readonly, assign) nsmanagedobjectmodel *managedobjectmodel;
//实体所在的模型管理对象的名称
@property (null_resettable, copy) nsstring *managedobjectclassname;
//实体名
@property (nullable, copy) nsstring *name;
//设置是否是抽象实体
@property (getter=isabstract) bool abstract;
//子类实体字典
@property (readonly, copy) nsdictionary<nsstring *, nsentitydescription *> *subentitiesbyname;
//所有子类实体对象数组
@property (strong) nsarray<nsentitydescription *> *subentities;
//父类实体
@property (nullable, readonly, assign) nsentitydescription *superentity;
//所有属性字典
@property (readonly, copy) nsdictionary<nsstring *, __kindof nspropertydescription *> *propertiesbyname;
//所有属性数组
@property (strong) nsarray<__kindof nspropertydescription *> *properties;
//所有常类型属性
@property (readonly, copy) nsdictionary<nsstring *, nsattributedescription *> *attributesbyname;
//所有关系
@property (readonly, copy) nsdictionary<nsstring *, nsrelationshipdescription *> *relationshipsbyname;
//某个实体类型的所有关系
- (nsarray<nsrelationshipdescription *> *)relationshipswithdestinationentity:(nsentitydescription *)entity;
//判断是否是某种实体
- (bool)iskindofentity:(nsentitydescription *)entity;

nspropertydescription类是数据模型属性的父类,nsattributedescription和nsrelationshipdescription都是继承于nspropertydescription类,nsattributedescription描述正常类型的属性,nsrelationshipdescription用于描述自定义类型的关系。

三、持久化存储协调者类nspersistentstorecoordinator

nspersistentstorecoordinator建立数据模型与本地文件或数据库之间的联系,通过它将本地数据读入内存或者将修改过的临时数据进行持久化的保存。其初始化与链接数据持久化接收对象方法如下:

//通过数据模型管理对象进行初始化
- (instancetype)initwithmanagedobjectmodel:(nsmanagedobjectmodel *)model;
//添加一个持久化的数据接收对象
- (nullable __kindof nspersistentstore *)addpersistentstorewithtype:(nsstring *)storetype configuration:(nullable nsstring *)configuration url:(nullable nsurl *)storeurl options:(nullable nsdictionary *)options error:(nserror **)error;
//移除一个持久化的数据接收对象
- (bool)removepersistentstore:(nspersistentstore *)store error:(nserror **)error;

四、数据对象管理上下文nsmanagedobjectcontext

nsmanagedobjectcontext是进行数据管理的核心类,我们通过这个类来进行数据的增删改查等操作。其中常用方法如下:

//初始化方法 通过一个并发类型进行初始化 参数枚举如下:
/*
typedef ns_enum(nsuinteger, nsmanagedobjectcontextconcurrencytype) {
    nsprivatequeueconcurrencytype  = 0x01,//上下文对象与私有队列关联
    nsmainqueueconcurrencytype   = 0x02//上下文对象与主队列关联
};
*/
- (instancetype)initwithconcurrencytype:(nsmanagedobjectcontextconcurrencytype)ct;
//异步执行block
- (void)performblock:(void (^)())block;
//同步执行block
- (void)performblockandwait:(void (^)())block;
//关联数据持久化对象
@property (nullable, strong) nspersistentstorecoordinator *persistentstorecoordinator;
//是否有未提交的更改
@property (nonatomic, readonly) bool haschanges;
//进行查询数据请求
- (nullable nsarray *)executefetchrequest:(nsfetchrequest *)request error:(nserror **)error;
//进行查询数据条数请求
- (nsuinteger) countforfetchrequest: (nsfetchrequest *)request error: (nserror **)error ;
//插入元素
- (void)insertobject:(nsmanagedobject *)object;
//删除元素
- (void)deleteobject:(nsmanagedobject *)object;
//回滚一步操作
- (void)undo;
//清楚缓存
- (void)reset;
//还原数据
- (void)rollback;
//提交保存数据
- (bool)save:(nserror **)error;

延伸 · 阅读

精彩推荐
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01