CoreDataManager-Swift版-兼容iOS10以前的版本
import UIKit
import CoreData // coredata管理器
class CoreDataManager: NSObject { // 单例
static let sharedManager:CoreDataManager = CoreDataManager() // 私有化构造函数
override private init(){
super.init()
} // 持久化容器,可以提供管理上下文
// iOS10推出,为了兼容低版本,我们这里设置private,不再使用,手动方式实现管理对象上下文,见下一个属性
// 包含了CoreDataStack中的所有核心对象,下面是很重要的三个对象
// viewContext: NSManagedObjectContext - 管理上下文,主要负责数据操作
// managedObjectModel: NSManagedObjectModel - 管理对象模型
// persistentStoreCoordinator: NSPersistentStoreCoordinator
private lazy var persistentContainer: NSPersistentContainer? = { // CoreData的核心对象都不是线程安全的
// 使用同步锁/互斥锁,保证线程安全
objc_sync_enter(self)
// 实例化对象,需要指定数据模型
// 指定的名称 == 数据模型的名称 == 沙盒中数据库的名称
// let container = NSPersistentContainer(name: "demo_db") // 管理对象模型,参数传入nil,自动将mainBundle中所有的数据模型合并
let model = NSManagedObjectModel.mergedModel(from: nil)! // 实例化持久化容器
// 参数一:数据库名字
// 参数二:合并后的模型
var container:NSPersistentContainer? = NSPersistentContainer(name: "ys.db", managedObjectModel: model) // “同步方式” 加载 “持久化存储” -> 本质是 打开/新建/修改数据库(同步方式,保证线程安全)
container?.loadPersistentStores(completionHandler: { (storeDescription, error) in
// 判断创建数据库是否出现错误
if let error = error as NSError? {
/*
常见错误:
1、目录不存在,或者禁止写入,无法创建数据库文件
2、设备存储空间不足
3、由于权限或设备锁定时的数据保护,不能访问持久化存储
4、数据库不能被迁移到当前模型版本
*/
print("打开/新建/修改数据库出现错误:\(error)")
container = nil
}
}) objc_sync_exit(self) return container
}() // 管理对象上下文
lazy var moc:NSManagedObjectContext? = {
// 同步锁/互斥锁保护
objc_sync_exit(self) // 实例化管理上下文
var mocObj:NSManagedObjectContext? = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) // 实例化对象模型
let momObj = NSManagedObjectModel.mergedModel(from: nil)! // 持久化存储调度器
let psc = NSPersistentStoreCoordinator(managedObjectModel: momObj) // 添加数据库
// 参数1:数据存储类型
// 参数3:保存SqLite数据库文件的URL
// 参数4:设置数据库选项
let cacheDir = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).last!
let path = (cacheDir as NSString).appendingPathComponent("ys.db")
let dict = [NSMigratePersistentStoresAutomaticallyOption:true,
NSInferMappingModelAutomaticallyOption:true] let persistentStore = try? psc.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: URL(fileURLWithPath: path), options: dict) if persistentStore != nil{
// 给管理上下文指定存储调度器
mocObj?.persistentStoreCoordinator = psc
}
else{
print("打开/新建/修改数据库出错")
mocObj = nil
} objc_sync_exit(self) return mocObj
}() // 保存上下文
func saveContext () {
if let context = moc{
// 事务:可以保存多个数据,不一定每次数据发生变化都需要保存,可以一次性保存
if context.hasChanges {
do {
try context.save()
} catch {
let nserror = error as NSError
print("保存数据出错:\(nserror)")
}
}
}
}
}
CoreDataManager-Swift版-兼容iOS10以前的版本的更多相关文章
- CoreDataManager-OC版-兼容iOS10以前的版本
头文件: #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> /** CoreData管理器 */ ...
- idea2019版与maven3.6.2版本不兼容引发的血案
昨天遇到了点问题解决浪费了一些时间(导致更新内容较少)回顾下问题 项目出现Unable to import maven project: See logs for details 翻了好多博客 莫名的 ...
- Swift版音乐播放器(简化版),swift音乐播放器
这几天闲着也是闲着,学习一下Swift的,于是到开源社区Download了个OC版的音乐播放器,练练手,在这里发扬开源精神, 希望对大家有帮助! 这个DEMO里,使用到了 AudioPlayer(对音 ...
- 快速排序OC、Swift版源码
前言: 你要问我学学算法在工作当中有什么用,说实话,当达不到那个地步的时候,可能我们不能直接的感觉到它的用处!你就抱着这样一个心态,当一些APP中涉及到算法的时候我不想给其他人画界面!公司的项目也是暂 ...
- [iOS开发]Xcode8兼容iOS7以及低版本Xcode调试高版本iOS系统
现在的项目一般都要兼容iOS7系统,同时也要兼容iOS10,在Xcode8上面,默认情况下无法调试iOS7,因为缺乏调试iOS7需要的配置文件.同时在低版本的Xcode上面(8以下),也无法调试iOS ...
- Xcode8兼容iOS7以及低版本Xcode调试高版本iOS系统
我们使用Xcode8新建的工程,默认支持的最低系统是iOS8,我们可以手动更改版本到7.0,但是不支持真机调试. 现在的项目一般都要兼容iOS7系统,同时也要兼容iOS10,在Xcode8上面,默认情 ...
- 【原】webapp开发中兼容Android4.0以下版本的css hack
话说现在的手机型号越来越多,主要还是android和ios这2个巨头称霸了江湖,而他们自带的浏览器内核是webkit,那对于做移动网页开发的同事来说,一般只要做好webkit内核浏览器的展现效果就行了 ...
- Swift版iOS游戏框架Sprite Kit基础教程下册
Swift版iOS游戏框架Sprite Kit基础教程下册 试读下载地址:http://pan.baidu.com/s/1qWBdV0C 介绍:本教程是国内唯一的Swift版的Spritekit教程. ...
- Swift项目兼容Objective-C问题汇总
Swift项目兼容Objective-C问题汇总 转载自 http://www.cocoachina.com/swift/20150608/12025.html 本文是投稿文章,作者:一叶(博客)欢迎 ...
随机推荐
- Java中不同的并发实现的性能比较
Fork/Join框架在不同配置下的表现如何? 正如即将上映的星球大战那样,Java 8的并行流也是毁誉参半.并行流(Parallel Stream)的语法糖就像预告片里的新型光剑一样令人兴奋不已.现 ...
- Elasticsearch安装
在启动或者安装ES之前,需要先下载JDK 1.7以上的版本,对于2.0来说,要求JDK1.8以上. 检查JDK的版本 使用命令: java -version echo $JAVA_HOME 查看JDK ...
- 关于Entity Framework采用DB First模式创建后的实体批量修改相关属性技巧
Entity Framework采用DB First模式创建实体是比较容易与方便的,修改已创建的实体在个数不多的情况下也是没问题的,但如果已创建的实体比较多,比如10个实体以上,涉及修改的地方比较多的 ...
- c#使用WebClient登录网站抓取登录后的网页
C#登录网站实际上就是模拟浏览器提交表单,然后记录浏览器响应返回的会话Cookie值,再次发送请求时带着这个会话cookie值去请求就可以实现模拟登录的效果了. 如下类CookieAwareWebCl ...
- DIP依赖倒置原则
一.定义 1.高层模块不应该依赖低层模块,二者都应该依赖抽象 2.抽象不应该依赖于细节.细节应该依赖于抽象 二.层次化 1.简单介绍 结构良好的面向对象架构都具有清晰的层次定义,每个层次通过一个定义良 ...
- iOS阶段学习第六天笔记(数组)
iOS学习( ...
- 关于Class.getResource和ClassLoader.getResource的路径问题
Java中取资源时,经常用到Class.getResource和ClassLoader.getResource,这里来看看他们在取资源文件时候的路径问题. Class.getResource(Stri ...
- mybatis xml 中的特殊符转义字符号和模糊查询
xml特殊符号转义写法 < < 小于 <= <= 小于或等于 > > 大于 >= >= 大于或等于 <> <> 不等于 & ...
- JAVA实现的微信扫描二维码支付
吐槽一下 支付项目采用springMvc+Dubbo架构实现,只对外提供接口. 话说,为什么微信支付比支付宝来的晚了那么一点,一句话,那一阵挺忙的,然后就没有时间整理,最近做完支付宝支付,顺便也把微信 ...
- yii2 advance 安装
1. 前提条件,php版本得> 5.4 D:\phpStudy>php -v PHP (cli) (built: Sep ::) Copyright (c) - The PHP Group ...