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以前的版本的更多相关文章

  1. CoreDataManager-OC版-兼容iOS10以前的版本

    头文件: #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> /** CoreData管理器 */ ...

  2. idea2019版与maven3.6.2版本不兼容引发的血案

    昨天遇到了点问题解决浪费了一些时间(导致更新内容较少)回顾下问题 项目出现Unable to import maven project: See logs for details 翻了好多博客 莫名的 ...

  3. Swift版音乐播放器(简化版),swift音乐播放器

    这几天闲着也是闲着,学习一下Swift的,于是到开源社区Download了个OC版的音乐播放器,练练手,在这里发扬开源精神, 希望对大家有帮助! 这个DEMO里,使用到了 AudioPlayer(对音 ...

  4. 快速排序OC、Swift版源码

    前言: 你要问我学学算法在工作当中有什么用,说实话,当达不到那个地步的时候,可能我们不能直接的感觉到它的用处!你就抱着这样一个心态,当一些APP中涉及到算法的时候我不想给其他人画界面!公司的项目也是暂 ...

  5. [iOS开发]Xcode8兼容iOS7以及低版本Xcode调试高版本iOS系统

    现在的项目一般都要兼容iOS7系统,同时也要兼容iOS10,在Xcode8上面,默认情况下无法调试iOS7,因为缺乏调试iOS7需要的配置文件.同时在低版本的Xcode上面(8以下),也无法调试iOS ...

  6. Xcode8兼容iOS7以及低版本Xcode调试高版本iOS系统

    我们使用Xcode8新建的工程,默认支持的最低系统是iOS8,我们可以手动更改版本到7.0,但是不支持真机调试. 现在的项目一般都要兼容iOS7系统,同时也要兼容iOS10,在Xcode8上面,默认情 ...

  7. 【原】webapp开发中兼容Android4.0以下版本的css hack

    话说现在的手机型号越来越多,主要还是android和ios这2个巨头称霸了江湖,而他们自带的浏览器内核是webkit,那对于做移动网页开发的同事来说,一般只要做好webkit内核浏览器的展现效果就行了 ...

  8. Swift版iOS游戏框架Sprite Kit基础教程下册

    Swift版iOS游戏框架Sprite Kit基础教程下册 试读下载地址:http://pan.baidu.com/s/1qWBdV0C 介绍:本教程是国内唯一的Swift版的Spritekit教程. ...

  9. Swift项目兼容Objective-C问题汇总

    Swift项目兼容Objective-C问题汇总 转载自 http://www.cocoachina.com/swift/20150608/12025.html 本文是投稿文章,作者:一叶(博客)欢迎 ...

随机推荐

  1. 我读过的最好的epoll讲解--转自”知乎“

    首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象. 不管是文件,还是套接字,还是管道,我们都可以把他们看作流. 之后我们来讨论I/O的操作,通过read ...

  2. JS实现日程安排 日程安排插件

    代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="EmpWeekPla ...

  3. SQL_递归查询(复杂查询示例)

    需求: 一篇文章里有很多评论,每个评论又有很多回复评论,要求: 页面将文章展示出来,且文章的主评论按照评论时间分页展示,回复评论的评论完全展示在每个主评论下面,且按照回复时间排序 最终查询结果SQL查 ...

  4. 一文读懂UGC:互联网上的生态秘密

    转载自近乎: UGC(User- Generated Content)用户原创生产内容,它是相对于PGC(Professionally-produced Content)专业生产内容的一种内容来源,简 ...

  5. html5学习笔记(2)

    效果图 以下为源码 <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ...

  6. 【Java每日一题】20161125

    package Nov2016; import java.util.LinkedList; import java.util.List; public class Ques1125 { public ...

  7. MySQL Cursor

    MySQL Cursor Summary: in this tutorial, you will learn how to use MySQL cursor in stored procedures ...

  8. MAC下配置WebDav

    WebDav完全可以当成一个网络共享的文件服务器使用! # 1. 修改了两个配置文件 # 2. 创建web访问用户的用户名和口令 # 3. 创建了两个目录,并且设置了管理权限 # 切换目录 $ cd ...

  9. Guava学习笔记:Guava新增集合类型-Bimap

    BiMap提供了一种新的集合类型,它提供了key和value的双向关联的数据结构. 通常情况下,我们在使用Java的Map时,往往是通过key来查找value的,但是如果出现下面一种场景的情况,我们就 ...

  10. Fiddler (四) 实现手机的抓包

      Fiddler是我最喜爱的工具,几乎每天都用, 我已经用了8年了. 至今我也只学会其中大概50%的功能. Fiddler绝对称得上是"神器", 任何一个搞IT的人都得着的. 小 ...