本文僅對(duì)CoreData的增虚吟、刪邀摆、該羔挡、查操作做簡(jiǎn)單封裝洁奈。之所以說是簡(jiǎn)單封裝,是因?yàn)楸敬畏庋b不涉及多線程绞灼。
思路:創(chuàng)建一個(gè)單例類CoreDataManager--->添加屬性:NSManagedObjectModel利术、NSPersistentStoreCoordinator、
NSManagedObjectContext--->重寫該類初始化方法:在方法中初始化NSManagedObjectContext對(duì)象--->重寫set方法
(NSPersistentStoreCoordinator低矮、NSManagedObjectContext)--->封裝增印叁、刪、該军掂、查操作轮蜕。
1.準(zhǔn)備工作
.m文件中導(dǎo)入“#import <CoreData/CoreData.h>”并添加屬性:
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
2.創(chuàng)建單例類
static CoreDataManager*__manager;
//創(chuàng)建單例類
+(instancetype)shareManager{
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^{
__manager=[[self alloc]init];
});
return __manager;
}
3.重寫init方法
/*
*1、初始化方法蝗锥,初始化 NSManagedObjectContext
*2跃洛、NSManagedObjectContext:被管理者對(duì)象上下文 相當(dāng)于一個(gè)臨時(shí)數(shù)據(jù)庫 我們存儲(chǔ)或者查詢都是通過這個(gè)對(duì)象來的
*3、NSPersistentStoreCoordinator:文件存儲(chǔ)助理终议,相當(dāng)于數(shù)據(jù)庫的鏈接器汇竭,它是CoreData的核心 負(fù)責(zé)鏈接所有的模塊葱蝗, 包括真實(shí)的存儲(chǔ)文件;
*/
-(id)init{
if (self=[super init]) {
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) {
return nil;
}
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return self;
}
4.set方法:persistentStoreCoordinator
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
//CoreData是建立在SQLite之上的细燎,數(shù)據(jù)庫名稱需與.cdatamodel文件同名
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Model.sqlite"];
NSError *error = nil;
NSString *failureReason = @"There was an error creating or loading the application's saved data.";
// 加載sqlite數(shù)據(jù)庫文件
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
dict[NSLocalizedFailureReasonErrorKey] = failureReason;
dict[NSUnderlyingErrorKey] = error;
error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
//獲取沙盒Documents目錄中文件的URL
- (NSURL *)applicationDocumentsDirectory {
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
5.set方法:managedObjectModel
- (NSManagedObjectModel *)managedObjectModel {
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
// xcdataModeld文件編譯后為momd文件两曼,從資源文件加載NSManagedObjectModel
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
6.保存文件
//添加、刪除操作執(zhí)行后玻驻,需要調(diào)用該方法保存文件
- (void)saveContext {
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
NSError *error = nil;
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
}
7.添加數(shù)據(jù)
//第一種插入操作(根據(jù)字典傳遞數(shù)據(jù))
-(BOOL)insertObjectWithEntity:(NSString*)entity parameter:(NSDictionary*)param{
NSManagedObject*object=[NSEntityDescription insertNewObjectForEntityForName:entity inManagedObjectContext:_managedObjectContext];
for (NSString*key in param.allKeys) {
[object setValue:param[key] forKey:key];
}
return YES;
}
//第二種插入操作(利用Block)
-(BOOL)insertObjectWithEntity:(NSString*)entity completion:(XHInsertBlock)completionHandle{
NSManagedObject*object=[NSEntityDescription insertNewObjectForEntityForName:entity inManagedObjectContext:_managedObjectContext];
completionHandle(object);
if (object) {
return YES;
}else{
return NO;
}
}
舉例:
//第一種:
NSDictionary*dic=@{@"name":@"Kevin"};
[_manager insertObjectWithEntity:@"People" parameter:dic];
[_manager saveContext];
//第二種:
[_manager insertObjectWithEntity:@"People" completion:^(NSManagedObject *object) {
[object setValue:@"Tom" forKey:@"name"];
}];
[_manager saveContext];
8.查詢數(shù)據(jù)
-(NSArray*)queryWithEntity:(NSString*)entity predicate:(NSPredicate*)predicate sortKey:(NSString*)key ascending:(BOOL)isAscending{
//創(chuàng)建取回?cái)?shù)據(jù)請(qǐng)求
NSFetchRequest*request=[[NSFetchRequest alloc]init];
//設(shè)置檢索的實(shí)體描述
NSEntityDescription*entityDes=[NSEntityDescription entityForName:entity inManagedObjectContext:_managedObjectContext];
[request setEntity:entityDes];
//謂詞悼凑,篩選數(shù)據(jù)
request.predicate=predicate;
//指定對(duì)檢索結(jié)果的排序方式
if ( key ){
//之所以添加判斷,是因?yàn)槿绻鹝ey為nil璧瞬,NSSortDescriptor則無法初始化佛析,程序會(huì)奔潰
NSSortDescriptor*sortDestor=[[NSSortDescriptor alloc]initWithKey:key ascending:isAscending];
[request setSortDescriptors:@[sortDestor]];
}
NSError*error=nil;
//執(zhí)行請(qǐng)求,返回?cái)?shù)組
NSArray*fetchedResult=[_managedObjectContext executeFetchRequest:request error:&error];
if (!fetchedResult) {
NSLog(@"error:%@ ,%@",error,[error userInfo]);
}
return fetchedResult;
}
舉例:
//查詢sex=@"Man"的people對(duì)象彪蓬,按照age的升序排列
NSPredicate*predicate=[NSPredicate predicateWithFormat:@"sex=%@",@"Man"];
dataArray=[_manager queryWithEntity:@"People" predicate:predicate sortKey:@"age" ascending:YES];
9.修改數(shù)據(jù)
修改數(shù)據(jù)建立在查詢數(shù)據(jù)的基礎(chǔ)上。查詢數(shù)據(jù)的方法返回的是存儲(chǔ)數(shù)據(jù)的內(nèi)存地址的指針變量捺萌。因此档冬,可以通過指針變量對(duì)其指向的內(nèi)存修改數(shù)據(jù)。
舉例:
People*people=(People*)dataArray[0];
people.name=@"Tom";
people.age=18;
10.刪除數(shù)據(jù)
-(BOOL)deleteObject:(NSManagedObject*)object{
if (object && [object isKindOfClass:[NSManagedObject class]]) {
[_managedObjectContext deleteObject:object];
return YES;
}
return NO;
}
舉例:
People*people=(People*)dataArray[0];
[_manager deleteObject:people];
[_manager saveContext];