免费开源的iOS开发学习平台

Core Data入门:1-概念简介

Core Data是苹果官方提供的管理数据层对象的框架,它提供了对象-关系映射(ORM)的功能,即能够将Objective-C对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成Objective-C对象。在此数据操作期间,我们不需要编写任何SQL语句。Core Data针对对象生命周期,以及持久化的对象图管理(object graph management)中的一些常见问题,提供了解决方案。Core Data的主要任务是负责数据更改的管理、序列化到磁盘、最小化内存占用以及查询数据。CoreData通常能有效减少50%-70%模型层的代码量。

Core Data中的术语

在学习Core Data之前,需要提前掌握下面几个术语:

  • 实体: 在Core Data中定义的类。在关系型数据库中,一个实体对应于一张表。最经典的例子是雇员和公司。
  • 属性:实体的一部分信息。比如,一个雇员实体有名字属性,职位属性,工资属性。在数据库中一个属性对应于表中的一个字段。
  • 关系:多个实体间的链接。在Core Data里两个实体的关系称为一对一关系。一个和多个实体的关系称为一对多的关系。比如一个经理和雇员有一对多的关系,一个经理管理着多个雇员,而一个雇员只会有一个经理。

Core Data中的核心类

  • NSManagedObjectModel:管理对象模型,用于描述应用程序的数据模型,这个模型包含实体(Entity)、特性(Property)、读取请求(Fetch Request)等。Core Data默认使用SQLite数据库作为存储源,因此你可以把数据类型当成数据库的表结构。

  • NSManagedObjectContext:管理对象上下文,参与对数据对象进行各种操作的全过程,并监测数据对象的变化,以提供对 undo/redo 的支持及更新绑定到数据的 UI。

  • NSPersistentContainer:相当于数据文件管理器,处理底层的对数据文件的读取与写入。一般我们无需与它打交道。

Core Data中的常用方法

对于Core Data的操作,与SQLite类似,主要就是涉及数据的增删改查相关操作。由于Core Data中定义的API众多,对于初学者来说,可以预先掌握如下几个常用的方法。

  • 实例化一个管理对象。在Core Data中管理的都是NSManagedObject对象,在NSManagedObject.h中也提供了用于创建NSManagedObject对象的方法
- (__kindof NSManagedObject*)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(nullable NSManagedObjectContext *)context;
  • 执行查询请求。在NSManagedObjectContext类中,提供了用于查询的方法,在该方法中,需要传递一个NSFetchRequest类型的参数作为查询请求,该参数中包含了查询条件等相关信息
- (nullable NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error;
  • 查询条件的设置。在Core Data中,不需要编写SQL语句,但提供了NSFetchRequest类,在该类中,我们可以设置相关的查询条件,包括需要查询的对象、结果的排序方式(NSSortDescriptor类)以及查询条件(NSPredicate类)。由此可见,Core Data的使用更加地面向对象。
+ (instancetype)fetchRequestWithEntityName:(NSString*)entityName; 
@property (nullable, nonatomic, strong) NSArray<NSSortDescriptor *> *sortDescriptors;
@property (nullable, nonatomic, strong) NSPredicate *predicate;
  • 插入与删除对象。在NSManagedObjectContext类中,提供了用于针对NSManagedObject类对象的插入以及删除方法,利用这些方法我们就不再需要编写INSERT语句以及DELETE语句了。
- (void)insertObject:(NSManagedObject *)object;
- (void)deleteObject:(NSManagedObject *)object;