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 本文是投稿文章,作者:一叶(博客)欢迎 ...
随机推荐
- springmvc学习笔记--json--返回json的日期格式问题
(一)输出json数据 springmvc中使用jackson-mapper-asl即可进行json输出,在配置上有几点: 1.使用mvc:annotation-driven 2.在依赖管理中添加ja ...
- SQL Server安全(2/11):身份验证(Authentication)
在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Se ...
- HashMap的resize和Fail-Fast机制
1.HashMap的resize(rehash): 当HashMap中的元素越来越多的时候,hash冲突的几率也就越来越高,因为数组的长度是固定的.所以为了提高查询的效率,就要对HashMap的数组进 ...
- 利用grunt-contrib-connect和grunt-connect-proxy搭建前后端分离的开发环境
前后端分离这个词一点都不新鲜,完全的前后端分离在岗位协作方面,前端不写任何后台,后台不写任何页面,双方通过接口传递数据完成软件的各个功能实现.此种情况下,前后端的项目都独立开发和独立部署,在开发期间有 ...
- 一个ActionResult中定位到两个视图—<团委项目>
在使用MVC做项目的时候一般的情况就是一个ActionResult一个视图,这样对应的Return View();就可以找到下面对应的视图,这是根据一个原则,"约定大于配置&quo ...
- 一个有意思的js小问题
问题:如何实现以下函数? add(2, 5); // 7 add(2)(5); // 7 第一个就不用说了,很简单,关键是看第二个,add(2)(5),可见add(2)应该返回的是一个函数,这个函数再 ...
- ASP.NET MVC系列:为视图添加查询功能
首先,在MoviesController里添加一个查询方法,代码如下 public ActionResult SearchIndex(string title) { //查询数据库中的电影表 var ...
- .Net语言 APP开发平台——Smobiler学习日志:仿12306的APP登陆界面
最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的”Smobil ...
- QTableWidget控件总结
[1]QTableWidget简介 QTableWidget是QT对话框设计中常用的显示数据表格的控件. 学习QTableWidget就要首先看看QTableView控件(控件也是有”家世“的!就像研 ...
- Java的HashSet类
如果要查找一个集合中是否包含了某个对象,那么就需要把这个对象和这个集合中的每个对象依次进行比较和判断,直到找到这个对象为止,或者把所有对象都比较一次为止(如果最后一个对象才是要查找的对象,或者集合中没 ...