CoreDataManager-OC版-兼容iOS10以前的版本

头文件:

 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
原文地址:https://www.cnblogs.com/panda1024/p/6219726.html