头文件:
1 #import <Foundation/Foundation.h> 2 #import <CoreData/CoreData.h> 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 stack 15 // 如果重写了只读属性的 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 数据库文件的 URL 43 4> 设置数据库选项 44 */ 45 NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject; 46 NSString *path = [cacheDir stringByAppendingPathComponent:@"ys.db"]; 47 // 将本地文件的完整路径转换成 文件 URL 48 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 support 63 - (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