oreData是iOS5后,蘋果提供的原生的用于對(duì)象化管理數(shù)據(jù)并且持久化的框架竿拆。CoreData本質(zhì)上是將底層數(shù)據(jù)庫封裝成對(duì)象進(jìn)行管理。但數(shù)據(jù)庫實(shí)際上只是CoreData的一個(gè)功能,并不是全部功能。在iOS開發(fā)中振定,除了可以使用CoreData進(jìn)行數(shù)據(jù)管理,還可以使用SQLite進(jìn)行內(nèi)存管理肉拓。并且有封裝好SQLite代碼的OC框架FMDB給我們使用后频。具體看我上篇文章。SQLite重要框架FMDB的使用.但對(duì)比SQLite,CoreData有下面幾個(gè)優(yōu)勢(shì)暖途。第一是CoreData作為蘋果提供的原生框架卑惜,在內(nèi)存方法比SQLite有性能上的優(yōu)勢(shì)。第二是CoreData操作數(shù)據(jù)不需要使用SQLite代碼驻售,使用方便露久。第三是CoreData把數(shù)據(jù)用面向?qū)ο蠓绞竭M(jìn)行管理,操作數(shù)據(jù)庫更方便芋浮。
CoreData的核心是Core Data stack(技術(shù)棧堆)。CoreData就是依靠Core Data stack中的幾個(gè)對(duì)象進(jìn)行數(shù)據(jù)操作的壳快。這幾對(duì)象是:
NSManagedObjectContext 纸巷,管理對(duì)象的上下文: 負(fù)責(zé)管理模型對(duì)象的一個(gè)集合,
NSManagedObjectModel 被管理的對(duì)象模型
NSPersistentStoreCoordinator 存儲(chǔ)調(diào)度器: 負(fù)責(zé)將數(shù)據(jù)保存到磁盤眶痰,
NSPersistentStore用于保存模型數(shù)據(jù)瘤旨,受NSPersistentStoreCoordinator 存儲(chǔ)調(diào)度器的操控。
這三個(gè)對(duì)象的關(guān)系如下面圖片所示竖伯,蘋果官方給出了這幾個(gè)對(duì)向關(guān)系的圖解存哲。簡單理解起來就是最上面的NSManagedObjectContext負(fù)責(zé)管理對(duì)象模型。然后將管理的對(duì)象模型發(fā)送給NSPersistentStoreCoordinator 存儲(chǔ)調(diào)度器七婴,存儲(chǔ)調(diào)度器通過NSPersistentStore操作SQLite語句祟偷,將數(shù)據(jù)持久化到本地,保存到StoryFile中打厘。
數(shù)據(jù)庫的使用也很簡單修肠,我們只需要在創(chuàng)建項(xiàng)目文件的時(shí)候勾選使用coreData的選項(xiàng),系統(tǒng)就會(huì)幫我們創(chuàng)建一個(gè)包含CoreData的項(xiàng)目文件户盯。
然后在界面上就會(huì)出現(xiàn)下面的變化嵌施。我們點(diǎn)擊添加屬性按鈕饲化,就能在數(shù)據(jù)庫中給數(shù)據(jù)模型添加屬性。
添加完數(shù)據(jù)庫后我們進(jìn)行下面操作就能將數(shù)據(jù)模型轉(zhuǎn)為代碼文件吗伤。
做完上面操作之后我們就能對(duì)數(shù)據(jù)庫模型進(jìn)行操作了吃靠。
我們?cè)诓僮鲾?shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行增刪改查的時(shí)候足淆,都需要用到Core Data stack這個(gè)工具。我們自己可以封裝一個(gè)Core Data stack夕冲,這樣更能加深我們對(duì)Core Data stack這個(gè)工具的理解裂逐。
下面是封裝一個(gè)工具類的代碼:
首先是該工具類的.h文件中的代碼
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#define KXBCoreManagerInstance [HMCoreDataStackManager shareInstance]
@interface HMCoreDataStackManager : NSObject
///單例
+(HMCoreDataStackManager*)shareInstance;
///管理對(duì)象上下文
@property(strong,nonatomic)NSManagedObjectContext *managerContenxt;
///模型對(duì)象
@property(strong,nonatomic)NSManagedObjectModel *managerModel;
///存儲(chǔ)調(diào)度器
@property(strong,nonatomic)NSPersistentStoreCoordinator *maagerDinator;
//保存數(shù)據(jù)的方法
-(void)save;
@end
然后是.m文件中的代碼
#import "HMCoreDataStackManager.h"
@implementation HMCoreDataStackManager
///單例的實(shí)現(xiàn)
+(HMCoreDataStackManager*)shareInstance
{
static HMCoreDataStackManager *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[HMCoreDataStackManager alloc]init];
});
return instance;
}
-(NSURL*)getDocumentUrlPath
{
///獲取文件位置
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]
;
}
//懶加載managerContenxt
-(NSManagedObjectContext *)managerContenxt
{
if (_managerContenxt != nil) {
return _managerContenxt;
}
_managerContenxt = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];
///設(shè)置存儲(chǔ)調(diào)度器
[_managerContenxt setPersistentStoreCoordinator:self.maagerDinator];
return _managerContenxt;
}
///懶加載模型對(duì)象
-(NSManagedObjectModel *)managerModel
{
if (_managerModel != nil) {
return _managerModel;
}
_managerModel = [NSManagedObjectModel mergedModelFromBundles:nil];
return _managerModel;
}
-(NSPersistentStoreCoordinator *)maagerDinator
{
if (_maagerDinator != nil) {
return _maagerDinator;
}
_maagerDinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:self.managerModel];
//添加存儲(chǔ)器
/**
* type:一般使用數(shù)據(jù)庫存儲(chǔ)方式NSSQLiteStoreType
* configuration:配置信息 一般無需配置
* URL:要保存的文件路徑
* options:參數(shù)信息 一般無需設(shè)置
*/
//拼接url路徑
NSURL *url = [[self getDocumentUrlPath]URLByAppendingPathComponent:@"sqlit.db" isDirectory:YES];
[_maagerDinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:nil];
return _maagerDinator;
}
-(void)save
{ ///保存數(shù)據(jù)
[self.managerContenxt save:nil];
}
通過上面代碼可以看出封裝一個(gè)Core Data stack類并不是很難歹鱼,我們需要做的是創(chuàng)建一個(gè)單例,然后懶加載一個(gè)NSManagedObjectContext卜高,并給NSManagedObjectContext添加存儲(chǔ)調(diào)度器NSPersistentStoreCoordinator弥姻。
懶加載存儲(chǔ)調(diào)度器的時(shí)候給存儲(chǔ)調(diào)度器添加存儲(chǔ)器PersistentStore。在最后提供一個(gè)保存數(shù)據(jù)的方法掺涛,每次我們修改數(shù)據(jù)庫中文件數(shù)據(jù)的時(shí)候庭敦,都需要用Core Data stack調(diào)用save方法保存數(shù)據(jù)。
CoreData關(guān)于數(shù)據(jù)的操作無非就是增刪改查薪缆。增刪改查我們同樣需要使用自定義的Core Data stack工具類秧廉。
增加數(shù)據(jù):
Person *p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" in Managed ObjectContext : kManagedObjectContext.managedObjectContext];
p.age = @(13);
p.name = @"張三";
[kManagedObjectContext save];
刪除數(shù)據(jù):
//1.創(chuàng)建一個(gè)查詢請(qǐng)求
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
//2.創(chuàng)建查詢謂詞(查詢條件)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",@"張三"];
//3.給查詢請(qǐng)求設(shè)置謂詞
request.predicate = predicate;
//4.查詢數(shù)據(jù)
NSArray<Person*> *arr = [kManagedObjectContext.managedObjectContext executeFetchRequest:request error:nil];
//5.刪除數(shù)據(jù)
[kManagedObjectContext.managedObjectContext deleteObject:arr.firstObject];
//6.同步到數(shù)據(jù)庫 [kManagedObjectContext save];
修改數(shù)據(jù):
//1.創(chuàng)建一個(gè)查詢請(qǐng)求
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
//2.創(chuàng)建查詢謂詞(查詢條件)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",@"張三"];
//3.給查詢請(qǐng)求設(shè)置謂詞
request.predicate = predicate;
//4.查詢數(shù)據(jù)
NSArray<Person*> *arr = [kManagedObjectContext.managedObjectContext executeFetchRequest:request error:nil];
//5.改變數(shù)據(jù)
arr.firstObject.name = @"李四";
arr.firstObject.age = @(18);
//6.同步到數(shù)據(jù)庫
[kManagedObjectContext save];
查詢數(shù)據(jù):
//1.創(chuàng)建一個(gè)查詢請(qǐng)求
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
//2.創(chuàng)建查詢謂詞(查詢條件)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",@"張三"];
//3.給查詢請(qǐng)求設(shè)置謂詞
request.predicate = predicate;
//4.查詢數(shù)據(jù)
NSArray<Person*> *arr = [kManagedObjectContext.managedObjectContext executeFetchRequest:request error:nil]; NSLog(@"%@====%@",arr.firstObject.name,arr.firstObject.age);
使用CoreData我們可以輕松實(shí)現(xiàn)很多數(shù)據(jù)的操作拣帽,例如通訊錄數(shù)據(jù)錄的增刪改查减拭。
在這里提供一個(gè)通訊錄數(shù)據(jù)操作的demo蔽豺,使用CoreData拧粪,我們能輕松地實(shí)現(xiàn)通訊錄功能修陡。