博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CoreDataManager-Swift版-兼容iOS10以前的版本
阅读量:6296 次
发布时间:2019-06-22

本文共 3926 字,大约阅读时间需要 13 分钟。

1 import UIKit  2 import CoreData  3   4 // coredata管理器  5 class CoreDataManager: NSObject {  6       7     // 单例  8     static let sharedManager:CoreDataManager = CoreDataManager()  9      10     // 私有化构造函数 11     override private init(){ 12         super.init() 13     } 14      15     // 持久化容器,可以提供管理上下文 16     // iOS10推出,为了兼容低版本,我们这里设置private,不再使用,手动方式实现管理对象上下文,见下一个属性 17     // 包含了CoreDataStack中的所有核心对象,下面是很重要的三个对象 18     // viewContext: NSManagedObjectContext - 管理上下文,主要负责数据操作 19     // managedObjectModel: NSManagedObjectModel - 管理对象模型 20     // persistentStoreCoordinator: NSPersistentStoreCoordinator 21     private lazy var persistentContainer: NSPersistentContainer? = { 22          23         // CoreData的核心对象都不是线程安全的 24         // 使用同步锁/互斥锁,保证线程安全 25         objc_sync_enter(self) 26         // 实例化对象,需要指定数据模型 27         // 指定的名称 == 数据模型的名称 == 沙盒中数据库的名称 28         // let container = NSPersistentContainer(name: "demo_db") 29          30         // 管理对象模型,参数传入nil,自动将mainBundle中所有的数据模型合并 31         let model = NSManagedObjectModel.mergedModel(from: nil)! 32          33         // 实例化持久化容器 34         // 参数一:数据库名字 35         // 参数二:合并后的模型 36         var container:NSPersistentContainer? = NSPersistentContainer(name: "ys.db", managedObjectModel: model) 37          38          39         // “同步方式” 加载 “持久化存储” -> 本质是 打开/新建/修改数据库(同步方式,保证线程安全) 40         container?.loadPersistentStores(completionHandler: { (storeDescription, error) in 41             // 判断创建数据库是否出现错误 42             if let error = error as NSError? { 43                 /* 44                  常见错误: 45                  1、目录不存在,或者禁止写入,无法创建数据库文件 46                  2、设备存储空间不足 47                  3、由于权限或设备锁定时的数据保护,不能访问持久化存储 48                  4、数据库不能被迁移到当前模型版本 49                  */ 50                 print("打开/新建/修改数据库出现错误:\(error)") 51                 container = nil 52             } 53         }) 54          55         objc_sync_exit(self) 56          57         return container 58     }() 59      60     // 管理对象上下文 61     lazy var moc:NSManagedObjectContext? = { 62         // 同步锁/互斥锁保护 63         objc_sync_exit(self) 64          65         // 实例化管理上下文 66         var mocObj:NSManagedObjectContext? = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) 67          68         // 实例化对象模型 69         let momObj = NSManagedObjectModel.mergedModel(from: nil)! 70          71         // 持久化存储调度器 72         let psc = NSPersistentStoreCoordinator(managedObjectModel: momObj) 73          74         // 添加数据库 75         // 参数1:数据存储类型 76         // 参数3:保存SqLite数据库文件的URL 77         // 参数4:设置数据库选项 78         let cacheDir = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).last! 79         let path = (cacheDir as NSString).appendingPathComponent("ys.db") 80         let dict = [NSMigratePersistentStoresAutomaticallyOption:true, 81                     NSInferMappingModelAutomaticallyOption:true] 82          83         let persistentStore = try? psc.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: URL(fileURLWithPath: path), options: dict) 84          85         if persistentStore != nil{ 86             // 给管理上下文指定存储调度器 87             mocObj?.persistentStoreCoordinator = psc 88         } 89         else{ 90             print("打开/新建/修改数据库出错") 91             mocObj = nil 92         } 93          94         objc_sync_exit(self) 95          96         return mocObj 97     }() 98      99     // 保存上下文100     func saveContext () {101         if let context = moc{102             // 事务:可以保存多个数据,不一定每次数据发生变化都需要保存,可以一次性保存103             if context.hasChanges {104                 do {105                     try context.save()106                 } catch {107                     let nserror = error as NSError108                     print("保存数据出错:\(nserror)")109                 }110             }111         }112     }113 }

 

转载于:https://www.cnblogs.com/panda1024/p/6219708.html

你可能感兴趣的文章
大佬是怎么思考设计MySQL优化方案的?
查看>>
<三体> 给岁月以文明, 给时光以生命
查看>>
Android开发 - 掌握ConstraintLayout(九)分组(Group)
查看>>
springboot+logback日志异步数据库
查看>>
Typescript教程之函数
查看>>
Android 高效安全加载图片
查看>>
vue中数组变动不被监测问题
查看>>
3.31
查看>>
类对象定义 二
查看>>
收费视频网站Netflix:用户到底想要“点”什么?
查看>>
MacOS High Sierra 12 13系统转dmg格式
查看>>
关于再次查看已做的多选题状态逻辑问题
查看>>
动态下拉菜单,非hover
查看>>
政府安全资讯精选 2017年第十六期 工信部发布关于规范互联网信息服务使用域名的通知;俄罗斯拟建立备用DNS;Google打击安卓应用在未经同意情况下收集个人信...
查看>>
简单易懂的谈谈 javascript 中的继承
查看>>
iOS汇编基础(四)指针和macho文件
查看>>
Laravel 技巧锦集
查看>>
Android 使用 ViewPager+RecyclerView+SmartRefreshLayout 实现顶部图片下拉视差效果
查看>>
Flutter之基础Widget
查看>>
写给0-3岁产品经理的12封信(第08篇)——产品运营能力
查看>>