1.如何提出Core Data框架?
由于SQLite API来操作数据库的操作方式与OC的编程思想不相同。
2.框架本质?
ORM框架,允许开发者以面向对象的方式持久化操作SQLite数据库。
3.Core Data简介
用于管理实体以及实体之间的关联关系的持久化——实体保存到持久化存储设备中在需要的时候取出。
虽然允许把数据内存保存在内存中(应用重启时数据会丢失)或非SQLite数据库的其他格式(例如XML文档),但是绝大部分框架底层都采用SQLite数据库作为持久化存储方式。
4.Core Data核心API
*托管对象模型(NSManagedObjectModel):该对象负责管理整个应用的所有实体以及实体之间的关联关系。当使用Xcode的图形界面设计了实体与实体之间关联关系之间,需要用该对象来加载、关联应用的托管对象模型。
*持久化存储协调器(NSPersistentStoreCooedinator):负责管理底层存储文件。
*托管对象上下文(NSManagedObejctContext):核心对象,完成应用程序对实体的增、删、改、查操作。
*实体描述(NSEntityDescription):该对象代表了关某摸个实体的描述信息。
*抓取请求(NSFetchRequest):该对象封装了查询实体请求(需要查询的实体,查询条件,排序规则等)。
5.Core Data持久化操作步骤:
(1)创建NSManagedObjectModel对象来加载管理应用的托管对象模型
(2)以NSManagedObjectModel为对象基础,创建NSPersistentStoreCoordinator对象,该对象确定了Core Data 底层数据的存储形式。
(3)以NSManagedObjectModel对象为基础,创建NSManagedObjectContext(进行持久化访问的核心对象)
(4)对于普通的增(新建实体)、删(删除实体),改(修改实体)操作,调用NSManagedObjectContext对象的save:方法保存到底层存储设备。
(5)查询,先创建NSFetchRequest对象,再调用NSManagedObjectContext的executeFetchRequest:error:方法执行查询该方法返回所有匹配条件的实体组成的NSArray。
6.初始化Core Data项目:
方法一:创建项目是勾选Use Core Data复选框
方法二:选择Empty Application手动初始化Core Data
为了深入理解我在这里选择第二种,步骤如下:
(1)添加CoreData.framework框架
(2)为该项目添加一个实体模型文件File->New->File,选择Core Data分类下的Data Model,我在这里起名为FKmodel.xcdatamodel。
//AppDelegate.h
#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>
@interface AppDelegate : UIResponder<UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
//定义Core Data三个核心API属性
@property (readonly,strong,nonatomic) NSManagedObjectContext* managedObjectContext;
@property (readonly,strong,nonatomic) NSManagedObjectModel* managedObjectModel;
@property (readonly,strong,nonatomic) NSPersistentStoreCoordinator* persistentStoreCoordinator;
-(void)savaContext;
//获取应用程序的Documents目录
-(NSURL *)applicationDocumentsDirectory;
@end
// AppDelegate.m
#import "AppDelegate.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
@synthesize managedObjectContext=_managedObjectContext;
@synthesize managedObjectModel=_managedObjectModel;
@synthesize persistentStoreCoordinator=_persistentStoreCoordinator;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
return YES;
}
- (void)applicationWillTerminate:(UIApplication *)application {
//当应用被动时,将所有托管上下文中的数据保存起来
//当应用将要被中断时,调用savaContext方法
//防止应用程序中断后进入后台被终止导致托管对象上下文中保存数据丢失
[self savaContext];
}
//如果当前托管对象上下文中包含未保存的修改,则保存修改到底层持久化设备
-(void)savaContext{
NSError *error=nil;
NSManagedObjectContext *managedObjectContext=self.managedObjectContext;
if([managedObjectContext hasChanges]&&![managedObjectContext save:&error]){
NSLog(@"保存出现错误:%@,%@",error,[error userInfo]);
abort();
}
}
//初始化应用托管对象上下文
-(NSManagedObjectContext *)managedObjectContext{
//如果_managedObjectContext 已经被初始化过,则直接返回该对象
if(_managedObjectContext!=nil){
return _managedObjectContext;
}
//获取持久化存储协调器
NSPersistentStoreCoordinator *coordinator =[self persistentStoreCoordinator];
//如果持久化存储协调器不为nil
if(coordinator!=nil){
//创建NSManagedObjectContext对象
_managedObjectContext =[[NSManagedObjectContext alloc] init];
//为NSManagedObjectContext对象设置持久化存储协调器
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
-(NSManagedObjectModel*)managedObjectModel{
//如果_managedObjectModel已经被初始化过,则直接返回该对象
if(_managedObjectModel !=nil){
return _managedObjectModel;
}
//获取实体模型文件对应的NSURL
NSURL *modelURL=[[NSBundle mainBundle]URLForResource:@"FKmodel" withExtension:@"modelURL"];
//加载应用的实体模型文件,并初始化NSManagedObjectModel对象
_managedObjectModel =[[NSManagedObjectModel alloc]initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
-(NSPersistentStoreCoordinator *)persistentStoreCoordinator{
//如果_persistentStoreCoordinator已经被初始化过,则直接返回该对象
if(_persistentStoreCoordinator !=nil){
return _persistentStoreCoordinator;
}
//获取SQLite数据库文件
NSURL *storeURL=[[self applicationDocumentsDirectory]URLByAppendingPathComponent:@"Books.sqlite"];
NSError *error=nil;
//以持久化对象模型为基础,创建NSPersistentStoreCoordinator对象
_persistentStoreCoordinator=[[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:[self managedObjectModel]];
//设置持久化存储协调器底层采用SQLite存储机制,如果设置失败则记录错误信息
if(![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]){
NSLog(@"设置持久化存储失败:%@,%@",error,[error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
//获取应用的Documents目录
-(NSURL *)applicationDocumentsDirectory{
return [[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]lastObject];
}
@end