1.如何提出Core Data框架?
由于SQLite API來操作數(shù)據(jù)庫的操作方式與OC的編程思想不相同。
2.框架本質(zhì)?
ORM框架,允許開發(fā)者以面向?qū)ο蟮姆绞匠志没僮鱏QLite數(shù)據(jù)庫。
3.Core Data簡介
? ? ? ?用于管理實體以及實體之間的關(guān)聯(lián)關(guān)系的持久化——實體保存到持久化存儲設(shè)備中在需要的時候取出。
? ? ? ? 雖然允許把數(shù)據(jù)內(nèi)存保存在內(nèi)存中(應(yīng)用重啟時數(shù)據(jù)會丟失)或非SQLite數(shù)據(jù)庫的其他格式(例如XML文檔),但是絕大部分框架底層都采用SQLite數(shù)據(jù)庫作為持久化存儲方式。
4.Core Data核心API
*托管對象模型(NSManagedObjectModel):該對象負(fù)責(zé)管理整個應(yīng)用的所有實體以及實體之間的關(guān)聯(lián)關(guān)系。當(dāng)使用Xcode的圖形界面設(shè)計了實體與實體之間關(guān)聯(lián)關(guān)系之間,需要用該對象來加載、關(guān)聯(lián)應(yīng)用的托管對象模型。
*持久化存儲協(xié)調(diào)器(NSPersistentStoreCooedinator):負(fù)責(zé)管理底層存儲文件。
*托管對象上下文(NSManagedObejctContext):核心對象,完成應(yīng)用程序?qū)嶓w的增、刪、改、查操作。
*實體描述(NSEntityDescription?):該對象代表了關(guān)某摸個實體的描述信息。
*抓取請求(NSFetchRequest):該對象封裝了查詢實體請求(需要查詢的實體,查詢條件,排序規(guī)則等)。
5.Core Data持久化操作步驟:
(1)創(chuàng)建NSManagedObjectModel對象來加載管理應(yīng)用的托管對象模型
(2)以NSManagedObjectModel為對象基礎(chǔ),創(chuàng)建NSPersistentStoreCoordinator對象,該對象確定了Core Data 底層數(shù)據(jù)的存儲形式。
(3)以NSManagedObjectModel對象為基礎(chǔ),創(chuàng)建NSManagedObjectContext(進(jìn)行持久化訪問的核心對象)
(4)對于普通的增(新建實體)、刪(刪除實體),改(修改實體)操作,調(diào)用NSManagedObjectContext對象的save:方法保存到底層存儲設(shè)備。
(5)查詢,先創(chuàng)建NSFetchRequest對象,再調(diào)用NSManagedObjectContext的executeFetchRequest:error:方法執(zhí)行查詢該方法返回所有匹配條件的實體組成的NSArray。
6.初始化Core Data項目:
方法一:創(chuàng)建項目是勾選Use Core Data復(fù)選框
方法二:選擇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;
//獲取應(yīng)用程序的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 {
//當(dāng)應(yīng)用被動時,將所有托管上下文中的數(shù)據(jù)保存起來
//當(dāng)應(yīng)用將要被中斷時,調(diào)用savaContext方法
//防止應(yīng)用程序中斷后進(jìn)入后臺被終止導(dǎo)致托管對象上下文中保存數(shù)據(jù)丟失
[self savaContext];
}
//如果當(dāng)前托管對象上下文中包含未保存的修改,則保存修改到底層持久化設(shè)備
-(void)savaContext{
NSError *error=nil;
NSManagedObjectContext *managedObjectContext=self.managedObjectContext;
if([managedObjectContext hasChanges]&&![managedObjectContext save:&error]){
NSLog(@"保存出現(xiàn)錯誤:%@,%@",error,[error userInfo]);
abort();
}
}
//初始化應(yīng)用托管對象上下文
-(NSManagedObjectContext *)managedObjectContext{
//如果_managedObjectContext 已經(jīng)被初始化過,則直接返回該對象
if(_managedObjectContext!=nil){
return _managedObjectContext;
}
//獲取持久化存儲協(xié)調(diào)器
NSPersistentStoreCoordinator *coordinator =[self persistentStoreCoordinator];
//如果持久化存儲協(xié)調(diào)器不為nil
if(coordinator!=nil){
//創(chuàng)建NSManagedObjectContext對象
_managedObjectContext =[[NSManagedObjectContext alloc] init];
//為NSManagedObjectContext對象設(shè)置持久化存儲協(xié)調(diào)器
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
-(NSManagedObjectModel*)managedObjectModel{
//如果_managedObjectModel已經(jīng)被初始化過,則直接返回該對象
if(_managedObjectModel !=nil){
return _managedObjectModel;
}
//獲取實體模型文件對應(yīng)的NSURL
NSURL *modelURL=[[NSBundle mainBundle]URLForResource:@"FKmodel" withExtension:@"modelURL"];
//加載應(yīng)用的實體模型文件,并初始化NSManagedObjectModel對象
_managedObjectModel =[[NSManagedObjectModel alloc]initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
-(NSPersistentStoreCoordinator *)persistentStoreCoordinator{
//如果_persistentStoreCoordinator已經(jīng)被初始化過,則直接返回該對象
if(_persistentStoreCoordinator !=nil){
return _persistentStoreCoordinator;
}
//獲取SQLite數(shù)據(jù)庫文件
NSURL *storeURL=[[self applicationDocumentsDirectory]URLByAppendingPathComponent:@"Books.sqlite"];
NSError *error=nil;
//以持久化對象模型為基礎(chǔ),創(chuàng)建NSPersistentStoreCoordinator對象
_persistentStoreCoordinator=[[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:[self managedObjectModel]];
//設(shè)置持久化存儲協(xié)調(diào)器底層采用SQLite存儲機(jī)制,如果設(shè)置失敗則記錄錯誤信息
if(![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]){
NSLog(@"設(shè)置持久化存儲失敗:%@,%@",error,[error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
//獲取應(yīng)用的Documents目錄
-(NSURL *)applicationDocumentsDirectory{
return [[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]lastObject];
}
@end