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