Swift-Core Data(1) 基础存储
Swift-Core Data(2) 基础存储
上一篇简单的写了点存储和查询功能,这篇写一下当你的项目没有勾选 Use Core Data
怎么办?
1.创建数据库模板
如上图创建一个数据库模板,创建好之后,安装上一篇文章创建 entity 和他的属性。
然后选择手动生成或者自动生成相应的实体类代码,系统默认是自动生成的,全凭个人所好。
2.创建 Core Data Stack
一个基本的 Core Data Stack由四个主要部分组成:托管对象 (NSManagedObject),托管对象上下文 (NSManagedObjectContext),持久化存储协调器 (NSPersistentStoreCoordinator),以及持久化存储 (NSPersistentStore)。
CoreDataStack,是自定义的一个CoreData 的栈对象,可以通过它,初始化项目的CoreData,以及获取到Context,对数据库进行增删改查等操作。
2.1 iOS9
在iOS9中,CoreData Stack的三个核心类是这样的:
- 管理对象上下文NSManagedObjectContext
- 对象模型NSManagedObjectModel
- 存储调度器NSPersistentStoreCoordinator
这个时候存储是在Documents中间。
2.2 iOS10之后
iOS10之后就有点不一样了, 增加了一个叫做NSPersistentContainer的东西。这个玩意儿作用就是用来管理CoreData Stack,为了能够让大家用起来更爽、更简单。
需要说明的是,NSPersistentContainer 一点都没有向下兼容的意思,完全不兼容iOS9.0,如果非要在iOS9.0里面使用,会直接闪退。
这个时候存储是在Library->Application Support中。
2.3 创建 ios 10 的CoreData Stack
创建CoreData Stack有两种方式:
1.创建个新项目,是勾选了 Core Data 的,然后将AppDelegate.swift 中有关的 Core Data 的代码复制粘贴过来,就可以使用了
注意:一定要将
let container = NSPersistentContainer(name: "")
中的name
参数改成你自己创建的数据库模板的名字
2.创建个类实现CoreData Stack
- Step1: 创建NSPersistentContainer
- Step2: 创建CoreData Stack
- Step3: 别忘了还有一个NSManagedObjectContext
- Step4: 提供一个保存数据的方法
- Step5: 在
AppDelegate.swift
里面初始化一下CoreDataStack
CoreDataStack.swift
class CoreDataStack {
//数据库模板名字
private let modelName: String
init(modelName: String) {
//初始化模板
self.modelName = modelName
}
//懒加载 持久化存储协调器 NSPersistenStoreCoordinator
lazy var storeContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: self.modelName)
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
debugPrint("Unclear error\(error)")
}
})
return container
}()
//懒加载 托管对象
lazy var managedContext: NSManagedObjectContext = {
return self.storeContainer.viewContext
}()
//数据库保存数据的方法
func saveContext() {
guard managedContext.hasChanges else { return }
do {
try managedContext.save()
} catch let error as NSError {
debugPrint("Unclear error\(error)")
}
}
}
AppDelegate.swift
里面初始化
AppDelegate.swift
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var managedContext: NSManagedObjectContext!
lazy var coreDataStack = CoreDataStack(modelName: "PersonCoreData")
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
self.managedContext = coreDataStack.managedContext
return true
}
}