Swift-Core Data(1) 基礎存儲
Swift-Core Data(2) 基礎存儲
上一篇簡單的寫了點存儲和查詢功能,這篇寫一下當你的項目沒有勾選 Use Core Data
怎么辦?
1.創(chuàng)建數(shù)據(jù)庫模板
如上圖創(chuàng)建一個數(shù)據(jù)庫模板,創(chuàng)建好之后,安裝上一篇文章創(chuàng)建 entity 和他的屬性泻帮。
然后選擇手動生成或者自動生成相應的實體類代碼,系統(tǒng)默認是自動生成的,全憑個人所好。
2.創(chuàng)建 Core Data Stack
一個基本的 Core Data Stack由四個主要部分組成:托管對象 (NSManagedObject)饿自,托管對象上下文 (NSManagedObjectContext)匀们,持久化存儲協(xié)調(diào)器 (NSPersistentStoreCoordinator),以及持久化存儲 (NSPersistentStore)霉赡。
CoreDataStack炒事,是自定義的一個CoreData 的棧對象,可以通過它娃圆,初始化項目的CoreData玫锋,以及獲取到Context,對數(shù)據(jù)庫進行增刪改查等操作讼呢。
2.1 iOS9
在iOS9中撩鹿,CoreData Stack的三個核心類是這樣的:
- 管理對象上下文NSManagedObjectContext
- 對象模型NSManagedObjectModel
- 存儲調(diào)度器NSPersistentStoreCoordinator
這個時候存儲是在Documents中間。
2.2 iOS10之后
iOS10之后就有點不一樣了, 增加了一個叫做NSPersistentContainer的東西悦屏。這個玩意兒作用就是用來管理CoreData Stack三痰,為了能夠讓大家用起來更爽吧寺、更簡單。
需要說明的是散劫,NSPersistentContainer 一點都沒有向下兼容的意思稚机,完全不兼容iOS9.0,如果非要在iOS9.0里面使用获搏,會直接閃退赖条。
這個時候存儲是在Library->Application Support中。
2.3 創(chuàng)建 ios 10 的CoreData Stack
創(chuàng)建CoreData Stack有兩種方式:
1.創(chuàng)建個新項目,是勾選了 Core Data 的,然后將AppDelegate.swift 中有關的 Core Data 的代碼復制粘貼過來,就可以使用了
注意:一定要將
let container = NSPersistentContainer(name: "")
中的name
參數(shù)改成你自己創(chuàng)建的數(shù)據(jù)庫模板的名字
2.創(chuàng)建個類實現(xiàn)CoreData Stack
- Step1: 創(chuàng)建NSPersistentContainer
- Step2: 創(chuàng)建CoreData Stack
- Step3: 別忘了還有一個NSManagedObjectContext
- Step4: 提供一個保存數(shù)據(jù)的方法
- Step5: 在
AppDelegate.swift
里面初始化一下CoreDataStack
CoreDataStack.swift
class CoreDataStack {
//數(shù)據(jù)庫模板名字
private let modelName: String
init(modelName: String) {
//初始化模板
self.modelName = modelName
}
//懶加載 持久化存儲協(xié)調(diào)器 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
}()
//數(shù)據(jù)庫保存數(shù)據(jù)的方法
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
}
}