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 本文是投稿文章,作者:一叶(博客)欢迎 ...
随机推荐
- Windows Azure Cloud Service (47) 修改Cloud Service时区
<Windows Azure Platform 系列文章目录> 本文介绍内容适合于Azure Global和Azure China 我们在使用Cloud Service的时候,会发现默认的 ...
- Azure Redis Cache (4) 配置和管理Redis Cache
<Windows Azure Platform 系列文章目录> 我们在创建完Azure Redis Cache后,经常需要切换Redis Cache的服务级别,这里我简单介绍一下使用Azu ...
- form上传文件以及跨域异步上传
要设置了enctype属性才能上传,需要使用上传的jar包,这里使用的是cos-26Dec2008.jar, 而且后台获取值的时候,getfile要放在第一位 一次设置好上传格式后没有上传文件,也就没 ...
- HTML5的WebGL实现的3D和2D拓扑树
在HT for Web中2D和3D应用都支持树状结构数据的展示,展现效果各异,2D上的树状结构在展现层级关系明显,但是如果数据量大的话,看起来就没那么直观,找到指定的节点比较困难,而3D上的树状结构在 ...
- Moon.Orm 5.0 (MQL版) 驱动开发方案
Moon.Orm 5.0 (MQL版) 配置说明 这一文中说明了如何配置,如何写自己的驱动.要写自己的驱动方法就是继承基类Db, Db的类结构,点击查看
- 七、L2CAP
1. L2CAP 在BR/EDR模式下,在connection procedure成功执行后,两台设备通过一条物理信道(physical channel)连接在一起,同时两者之间建立起了一条 ...
- node.js下when.js(Promises/A)的实践
假设一个业务场景: 通过rss地址,获取rss并保存于文件,rss地址保存于文件中. 完成该场景的业务需要完成3个任务: 1.从文件中读取rss地址. 2.获取rss. 3.保存于文件. 最后将这三个 ...
- Sandcastle入门:创建C#帮助文档
Sandcastle入门:创建C#帮助文档 今天学到了一个东西:利用vs2005生成的dll/xml来生成帮助文档. 完成这个伟大任务的是Sandcastle,微软推出的类库文档编译工具. 在开始这篇 ...
- 只用CSS实现容器内图片上下左右居中
一直以来,大家都知道,DIV容器内设置 text-align:center 即可让图片居中,但是DIV内默认的图片是上对齐,不会上下居中,如果想要实现这样的效果,JS判断是比较麻烦的,因为DIV容器内 ...
- easyui-layout 布局自适应
最近在把以前写的一个项目改成用easyui做前端.过程中遇到了不少问.其中一个就是datagrid不能很好的布.想了好多办法都有局限.最后想到会不会是布局的问题,经过实,最后问题解. 1:比如在项目中 ...