头文件:
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h> /**
CoreData管理器
*/
@interface CoreDataManager : NSObject + (instancetype)sharedManager; /**
持久化容器 - 可以提供管理上下文 iOS 10 推出
包含了 Core Data stack 中所有的核心对象,都不是线程安全的 - NSManagedObjectContext *viewContext; 管理上下文
- NSManagedObjectModel *managedObjectModel;
- NSPersistentStoreCoordinator *persistentStoreCoordinator;
*/
//@property (readonly, strong) NSPersistentContainer *persistentContainer; /**
管理对象上下文
*/
@property (readonly, strong) NSManagedObjectContext *moc; /**
保存上下文
*/
- (void)saveContext; @end
.m文件:
#import "CoreDataManager.h" @implementation CoreDataManager + (instancetype)sharedManager {
static id instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [self new];
});
return instance;
} #pragma mark - Core Data stack
// 如果重写了只读属性的 getter 方法,编译器不再提供 _成员变量
@synthesize moc = _moc; /**
为了低版本的兼容
*/
- (NSManagedObjectContext *)moc { if (_moc != nil) {
return _moc;
} // 互斥锁,应该锁定的代码尽量少!
@synchronized (self) { // 1. 实例化管理上下文
_moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; // 2. 管理对象模型(实体)
NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:nil]; // 3. 持久化存储调度器
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom]; // 4. 添加数据库
/**
1> 数据存储类型
3> 保存 SQLite 数据库文件的 URL
4> 设置数据库选项
*/
NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
NSString *path = [cacheDir stringByAppendingPathComponent:@"ys.db"];
// 将本地文件的完整路径转换成 文件 URL
NSURL *url = [NSURL fileURLWithPath:path]; NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption: @(YES),
NSInferMappingModelAutomaticallyOption: @(YES)}; [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:options error:NULL]; // 5. 给管理上下文指定存储调度器
_moc.persistentStoreCoordinator = psc;
} return _moc;
} #pragma mark - Core Data Saving support
- (void)saveContext {
NSManagedObjectContext *context = self.moc; // 判断上下文中是否有数据发生变化
// `事务` 可以保存多个数据,不一定每次数据变化都需要保存,例如:for 增加多条记录,就可以最后调用一次保存操作即可!
if (![context hasChanges]) {
return;
} // 保存数据
NSError *error = nil; if (![context save:&error]) {
NSLog(@"保存数据出错 %@, %@", error, error.userInfo);
}
} @end