注意:html
- 實體的屬性名稱,首字母必須小寫。咱們可使用駱駝命名法對實體的屬性進行命名。
- 在生成完成Entity子類後,打開子類文件,查看子類的標題上方是否有
@objc(EntityName)
標記,若是沒有,就加上。若是不加上,在使用上下文對象時,會提示找不到實體類。
由於咱們在建立項目的時候勾選了使用Use Core Data
,因此在項目中的AppDelegate.swift文件中,咱們能夠看到Xcode已經完成對NSManagedObjectContext
、NSManagedObjectModel
、NSPersistentStoreCoordinator
以及用於存儲的.saveContext()
方法。以下所示:sql
// MARK: - Core Data stack lazy var applicationDocumentsDirectory: NSURL = { let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) return urls[urls.count-1] as! NSURL }() lazy var managedObjectModel: NSManagedObjectModel = { let modelURL = NSBundle.mainBundle().URLForResource("CoreDataUsing", withExtension: "momd")! return NSManagedObjectModel(contentsOfURL: modelURL)! }() lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("CoreDataUsing.sqlite") var error: NSError? = nil var failureReason = "There was an error creating or loading the application's saved data." if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil, error: &error) == nil { coordinator = nil var dict = [String: AnyObject]() dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" dict[NSLocalizedFailureReasonErrorKey] = failureReason dict[NSUnderlyingErrorKey] = error error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) NSLog("Unresolved error \(error), \(error!.userInfo)") abort() } return coordinator }() lazy var managedObjectContext: NSManagedObjectContext? = { let coordinator = self.persistentStoreCoordinator if coordinator == nil { return nil } var managedObjectContext = NSManagedObjectContext() managedObjectContext.persistentStoreCoordinator = coordinator return managedObjectContext }() // MARK: - Core Data Saving support func saveContext () { if let moc = self.managedObjectContext { var error: NSError? = nil if moc.hasChanges && !moc.save(&error) { NSLog("Unresolved error \(error), \(error!.userInfo)") abort() } } }
注意:swift
- 若是在建立項目的時候沒有勾選
Use Core Data
,後續可使用添加Data Model
的方式添加。可是,若是使用手工的方式添加,那麼就須要手動的實如今AppDelegate
中的上述代碼。
要想插入數據到持久話存儲當中,根據CoreData的框架特性,咱們首先須要取得NSManagedObjectContext
對象,而後再建立想要插入的NSManagedObject
對象,並對這個對象的屬性進行賦值操做,最後經過保存上下文的方式,完成持久化操做。app
打開ViewController.swift文件,而後添加下面的代碼到.viewDidLoad()
方法當中。框架
override func viewDidLoad() { super.viewDidLoad() var delegate = UIApplication.sharedApplication().delegate as? AppDelegate var context = delegate?.managedObjectContext var user = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: context!) as! User user.name = "Aaron" delegate!.saveContext() }
下面的代碼首先取得當前運行的應用程序的AppDelegate
,而後取得由Xcode自動生成的上下文對象。dom
var delegate = UIApplication.sharedApplication().delegate as? AppDelegate var context = delegate?.managedObjectContext
下面的代碼用於新建一個NSManagedObject
實體實例,併爲這個實體的屬性賦值。ide
var user = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: context!) as! User user.name = "Aaron"
當咱們完成實體實例的配置後,須要保存改變,進行持久化操做。咱們可使用下面的代碼。學習
delegate!.saveContext()
全部對實體的操做都須要在當前應用程序的持久化上下文環境當中,這樣纔可以利用持久化上下文進行數據實體的持久話操做。url
下面是從持久化數據存儲提取所有「User」實體(表)的數據的方法。.net
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. var delegate = UIApplication.sharedApplication().delegate as? AppDelegate var context = delegate?.managedObjectContext var request = NSFetchRequest(entityName: "User") var results = context?.executeFetchRequest(request, error: nil) as! [User] for user in results { println("\(user.name)") } }
在獲取到持久化上下文以後,想要從持久化存儲中提取數據,首先須要建立一個提取數據請求。
var request = NSFetchRequest(entityName: "User")
而後在上下文中執行提取數據請求,而後將請求後的結果賦值給結果對象。
var results = context?.executeFetchRequest(request, error: nil) as! [User]
在取得提取結果以後,可使用遍歷等的方式,提取須要的數據結果。
for user in results { println("\(user.name)") }
要想更新數據,首先須要找到咱們須要更新的數據項目,咱們能夠爲數據提取請求配置查詢條件(謂詞,Predicate),而後執行請求取得須要更新的數據。而後直接修改數據對象的屬性值。最後,調用應用程序委託對象,進行持久化上下文操做。
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. var delegate = UIApplication.sharedApplication().delegate as? AppDelegate var context = delegate?.managedObjectContext var request = NSFetchRequest(entityName: "User") var predicate = NSPredicate(format: "%K like %@", argumentArray: ["name", "Aaron"]) request.predicate = predicate var aarons = context?.executeFetchRequest(request, error: nil) as! [User] for user1 in aarons { user1.name = "cong" } delegate?.saveContext() }
與更新數據相似,想要刪除數據,首先要找到對應的數據,而後使用持久話上下文的.deleteObject(...)
操做對制定的數據對象執行刪除操做,最後調用持久化存儲操做。
override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. var delegate = UIApplication.sharedApplication().delegate as? AppDelegate var context = delegate?.managedObjectContext var predicate = NSPredicate(format: "%K like %@", argumentArray: ["name", "cong"]) request.predicate = predicate var aarons = context?.executeFetchRequest(request, error: nil) as! [User] for user1 in aarons { context?.deleteObject(user1) } delegate?.saveContext() }