Core Data是苹果官方提供的管理数据层对象的框架,它提供了对象—关系映射(ORM)的功能,即能够将Objective-C对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成Objective-C对象。在此数据操作期间,不需要编写任何SQL语句。Core Data针对对象生命周期,以及持久化的对象图管理(object graph management)中的一些常见问题提供了解决方案。CoreData的主要任务是负责数据更改的管理、序列化到磁盘、最小化内存占用以及查询数据。CoreData通常能有效减少50%~70%模型层的代码量。
在学习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中管理的都是NSManagedObject对象,在NSManagedObject.h中也提供了用于创建NSManagedObject对象的方法。
-(__kindof NSManagerObject *)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(nullable NSManagedObjectContect *)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 *predocate;
插入与删除对象。在NSManagedObjectContext类中,提供了用于针对NSManagedObject类对象的插入以及删除方法,利用这些方法就不再需要编写INSERT语句以及DELETE语句了。
-(void)insertObject:(NSManagerObject *)object;
-(void)deleteObject:(NSManagerObject *)object;
示例 todo