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 本文是投稿文章,作者:一叶(博客)欢迎 ...
随机推荐
- JVM的GC概述
JVM的GC概述 GC即垃圾回收,是指jvm用于释放那些不再使用的对象所占用的内存.在充分理解了垃圾收集算法和执行过程后,才能有效的优化它的性能. 有些垃圾收集专用于特殊的应用程序.比如,实时应用程序 ...
- Glyphish – 精心打造的 iPhone & iPad 应用程序图标
Glyphish 是一套精心打造的图标库,包含 iOS 工具栏.标签栏.导航条等等,Glyphish 图标也完美的用在 Android.Windows Mobile App 和移动网站的 UI 设计等 ...
- ASP.NET MVC怎样引用你的model
在视图中,引用model,并绑定.有2种情况,一是数据集,另一个是单个model. 实现之前,有准备一个数据吧. 创建一个model: source code: namespace Insus.NET ...
- 介绍开源的.net通信框架NetworkComms框架 源码分析(十六 ) ConnectionStatic
原文网址: http://www.cnblogs.com/csdev Networkcomms 是一款C# 语言编写的TCP/UDP通信框架 作者是英国人 以前是收费的 目前作者已经开源 许可是 ...
- Nlog 记录日志到 sqlite
最近研究了一下Nlog这个日志框架,这里记录一下如何将日志写到sqlite中. 第一步:使用NuGet获取Nlog和Sqlite 第二步:在sqlite中创建一个database,这里我用了SQLit ...
- 孙鑫MFC学习笔记6:菜单编程
1.对菜单响应的顺序: 视类,文档类,框架类,应用程序类 2.消息的分类 3.CWnd继承自CCmdTarget类, 所以从CWnd派生出的类也可以接收WM_COMMAND消息 4.命令的消息路由 5 ...
- line-height 属性
p.small {line-height:90%} p.big {line-height:200%} 该属性会影响行框的布局.在应用到一个块级元素时,它定义了该元素中基线之间的最小距离而不是最 ...
- 数据查询语言DQL 与 内置函数(聚合函数)
数据查询语言DQL 从表中获取符合条件的数据 select select*from表的名字 查询表所有的数据.(select跟from必须一块用 成对出现的) * 表示所有字段,可以换成想要查询的 ...
- myeclipse中的文件内容被覆盖如何恢复
今天无意中,运行文件把原先的文件给覆盖掉了,通过查阅资料发现可以通过这样去恢复 点击被覆盖后的文件------->右击--------->选择replace with------>p ...
- mysql分页查询详解
我们做的后端项目一般都会有admin管理端,当管理端将要展示数据的时候,就需要用到分页.所以分页的考查在面试中也相当多.在mysql中进行分页查询时,一般会使用limit查询,而且通常查询中都会使用o ...