標籤:coredata data model swift ios 資料庫
新年到了,祝大家大家羊年快樂,喜氣洋洋。上一話中我們簡單地介紹了一些coredata的基本知識,這一話我們通過編程來實現coredata的使用。這一話中建立的幾個變數對照上一話中講到的coredata中重要的變數,在AppDelegate中,添加如下代碼:
lazy var applicationDocumentsDirectory:NSURL = { let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) return urls[urls.count - 1] as NSURL }() //官方比較推薦的寫法
跟我們之前接觸的大多數資料庫訪問的語句相似,這是通過一個閉包來設定url的。
lazy var managedObjectModel: NSManagedObjectModel = { let modelUrl = NSBundle.mainBundle().URLForResource("Model", withExtension: "momd") return NSManagedObjectModel(contentsOfURL: modelUrl!)! }()//載入model
還記得我們在coredata中定義的那個Model麼,上面這段代碼會載入這個Model。
lazy var persistenetStoreCoordinator:NSPersistentStoreCoordinator = { var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("data.sqlite") var error: NSError? = nil var failureString = "Three was an error when creating or loading the application's saved data" if coordinator?.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil, error: &error) == nil { coordinator = nil let dict = NSMutableDictionary() dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's save data" dict[NSLocalizedFailureReasonErrorKey] = failureString dict[NSUnderlyingErrorKey] = error error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) NSLog("Unsolved error\(error), \(error.userInfo)") abort()//有錯誤直接退出 } return coordinator!//沒有錯誤就返回 }()//持久化
上面這段代碼定義了持久化的儲存空間和錯誤的處理方式
lazy var managedObjectContext:NSManagedObjectContext = { let coordinator = self.persistenetStoreCoordinator var managedObjectContext = NSManagedObjectContext() managedObjectContext.persistentStoreCoordinator = coordinator return managedObjectContext }()//上下文 變數定義足夠了之後我們來定義方法:
func saveContext(){ if let moc = self.managedObjectContext { var error:NSError? = nil if moc.hasChanges && !moc.save(&error){ NSLog("Unsolved error\(error), \(error.userInfo)") abort() } } }
上一話中說過,如果沒有調用save方法,那麼我們對coredata的操作都會在記憶體中,而不會持久化。定義完方法之後,我們對coredata的準備都已經完成了。最後強調一點,coredata並不是資料庫,它只是一個架構,協助我們進行資料庫操作,它並不關心我們把資料存到哪裡。此外我們只建立一個model是不夠的,需要再建立一個關聯檔案如所示:
一路點下去,後面的操作是自動關聯的,產生的檔案如下:
swift語言IOS8開發戰記21 Core Data2