• 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
  • 相关阅读:
    前端 CSS
    前端 HTML
    前端 JavaScript 初识
    网络编程——线程池
    网络编程——同一进程中的队列(多线程)
    网络编程——进程间的共享内存
    vue实现前端简易版模糊查询
    封装axios请求拦截器
    关于node中 mysql Client does not support authentication protocol requested by server; consider upgrading MySQL client 解决方法
    封装一个时间方法
  • 原文地址:https://www.cnblogs.com/panda1024/p/6219726.html
Copyright © 2020-2023  润新知