头文件:
1 #import2 #import 3 4 /** 5 CoreData管理器 6 */ 7 @interface CoreDataManager : NSObject 8 9 + (instancetype)sharedManager;10 11 /**12 持久化容器 - 可以提供管理上下文 iOS 10 推出13 包含了 Core Data stack 中所有的核心对象,都不是线程安全的14 15 - NSManagedObjectContext *viewContext; 管理上下文16 - NSManagedObjectModel *managedObjectModel;17 - NSPersistentStoreCoordinator *persistentStoreCoordinator;18 */19 //@property (readonly, strong) NSPersistentContainer *persistentContainer;20 21 /**22 管理对象上下文23 */24 @property (readonly, strong) NSManagedObjectContext *moc;25 26 /**27 保存上下文28 */29 - (void)saveContext;30 31 @end
.m文件:
1 #import "CoreDataManager.h" 2 3 @implementation CoreDataManager 4 5 + (instancetype)sharedManager { 6 static id instance; 7 static dispatch_once_t onceToken; 8 dispatch_once(&onceToken, ^{ 9 instance = [self new];10 });11 return instance;12 }13 14 #pragma mark - Core Data stack15 // 如果重写了只读属性的 getter 方法,编译器不再提供 _成员变量16 @synthesize moc = _moc;17 18 /**19 为了低版本的兼容20 */21 - (NSManagedObjectContext *)moc {22 23 if (_moc != nil) {24 return _moc;25 }26 27 // 互斥锁,应该锁定的代码尽量少!28 @synchronized (self) {29 30 // 1. 实例化管理上下文31 _moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];32 33 // 2. 管理对象模型(实体)34 NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:nil];35 36 // 3. 持久化存储调度器37 NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];38 39 // 4. 添加数据库40 /**41 1> 数据存储类型42 3> 保存 SQLite 数据库文件的 URL43 4> 设置数据库选项44 */45 NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;46 NSString *path = [cacheDir stringByAppendingPathComponent:@"ys.db"];47 // 将本地文件的完整路径转换成 文件 URL48 NSURL *url = [NSURL fileURLWithPath:path];49 50 NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption: @(YES),51 NSInferMappingModelAutomaticallyOption: @(YES)};52 53 [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:options error:NULL];54 55 // 5. 给管理上下文指定存储调度器56 _moc.persistentStoreCoordinator = psc;57 }58 59 return _moc;60 }61 62 #pragma mark - Core Data Saving support63 - (void)saveContext {64 NSManagedObjectContext *context = self.moc;65 66 // 判断上下文中是否有数据发生变化67 // `事务` 可以保存多个数据,不一定每次数据变化都需要保存,例如:for 增加多条记录,就可以最后调用一次保存操作即可!68 if (![context hasChanges]) {69 return;70 }71 72 // 保存数据73 NSError *error = nil;74 75 if (![context save:&error]) {76 NSLog(@"保存数据出错 %@, %@", error, error.userInfo);77 }78 }79 80 @end