在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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 NSError 108 print("保存数据出错:\(nserror)") 109 } 110 } 111 } 112 } 113 }
|
请发表评论