一、何为CoreData
CoreData是一个专门用来管理数据的框架,其在性能与书写方便上都有很大的优势,在数据库管理方面,apple强烈推荐开发者使用CoreData框架,在apple的官方文档中称,使用CoreData框架可以减少开发者50%——70%的代码量,这虽然有些夸张,但由此可见,CoreData的确十分强大。
二、设计数据模型
在iOS开发中,时常使用SQL数据库对大量的表结构数据进行处理,但是SQL有一个十分明显的缺陷,对于常规数据模型的表,其处理起来是没问题的,例如一个班级表,其中每条数据中有班级名称,人数这样的属性,一个学生表,其中每条数据有学生的姓名,性别,年龄这样的属性。但是如果要在表与表之间建立联系,自定义对象与自定义对象之间产生从属关系,使用SQL处理起来就十分麻烦了,例如如果这个班级表中有一个班长的属性,这个属性是一个学生类型。
1.创建实体类型及其属性
使用Xcode创建一个工程,在工程中新建一个文件,选择Core Data分类中的DataModel创建,如下图:
这时在Xcode的文件导航区会出现一个以xcdatamodeld为扩展名的文件,这个文件就是数据模型文件,点击Add Entity按钮添加一个实体类型,取名为SchoolClass,为这个类型添加两个属性,分别为名字name和学生数量stuNum,如下图:
2.对实体类型进行设置
在Xcode右侧的工具栏中可以对实体类型进行一些设置,选中一个实体类型,如下图:
Name设置实体类型的名称,Abstract Entity设置是否是抽象实体,如果勾选,则此实体不能被实例化,只能被继承,类似于抽象类,比如定义人为一个实体类型,在定义继承于人实体类型的老师、学生等来进行实例化。Parent Entity用来选择父类实体,Class用于设置对应的类的。
3.在实体对象之间建立关系
再创建一个学生类实体Student,添加name和age两个属性。选中SchoolClass,在其中的Relationships模块中点击+号,来添加一个关系,如下图:
这时,SchoolClass实体类型中就有了一个Student类型的班长属性。如果切换一下编辑风格,可以更加清晰的看到实体类型之间的关系,如下图:
4.对属性和关系进行设置
选中一个属性或者关系,在右侧的工具栏中可以对属性进行一些设置,如下图:
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;
本文向大家介绍iOS App中数据管理框架Core Data的基本数据操作教程,包括了iOS App中数据管理框架Core Data的基本数据操作教程的使用技巧和注意事项,需要的朋友参考一下 NSEntityDescription是实体描述对象,它可以类比如数据库中的表,NSEntityDescription存放的是表的结构信息。这些类都是一些抽象的结构类,并不存储实际每条数据的信息,具体的数据由
本文向大家介绍基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理,包括了基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理的使用技巧和注意事项,需要的朋友参考一下 大家对Bootstrap框架知识了解多少 Bootstrap是一个前端的技术框架,很多平台都可以采用,JAVA/PHP/.NET都可以用来做前端界面,整合JQuer
第二十章 开发Delphi对象式数据管理功能(五) 20.3.1.1写DFM文件的过程:WriteComponentResFie 该过程带有两个参数FileName和Instance。FileName参数指定要写入的DFM文件名,Instance参数是TComponent类型的,它指定要写入的部件名,一般是TForm对象的子类。该过程将Instance部件和其拥有的所有部件写入DFM文件。 这个
第二十章 开发Delphi对象式数据管理功能(四) 20.2.3 TReader对象 TReader对象是可实例化的用于从相联系的流中读取数据的Filer对象。TReader对象从TFiler继承下来,除了从TFiler继承的属性和方法外,TReader声明了不少属性、方法和事件。 Owner和Parent属性用于表示从Reader对象的流中读取的部件的拥有者和双亲结点。OnError,OnF
第二十章 开发Delphi对象式数据管理功能(三) 20.2.1.1 TFiler对象的属性和方法 1. Root属性 声明:property Root: TComponent; Root 属性给Filer对象指出被读写的对象中哪一个对象是根或主要拥有者。RootComponent和WriteRootComponent方法在读和写部件及其拥有的部件前先设置Root的值。 2. Ancestor属性
第二十章 开发Delphi对象式数据管理功能(二) 20.1.6 TResourceStream对象 TResourceStream对象是另一类MemoryStream对象,它提供对Windows 应用程序资源的访问,因此称它为资源流。TResourceSream也是从TCustomMemoryStream 继承的。因此在TCustomMemoryStream对象的基础上,定义了与指定资源模块或资