Core Data 學習筆記 應用示例

目錄

示例

使用Xcode建立Entity及屬性

  1. 建立一個新的項目,命名爲「CoreData」,並__勾選__「Use Core Data」
  2. 在建立成功的新項目中,找到「CoreData.xcdatamodeld」文件,並點擊打開
  3. 在主面板「Entities」中,添加一個名爲"User"的實體
  4. 點擊「User」實體,在右側爲實體添加兩個「Attribute」,分別爲「name」與「birthday」,類型都是「String」型
  5. 在「菜單欄」依次點擊「Editor」 - 「Create NSManagedObject Subclass」
  6. 點擊「Next」
  7. 勾選「User」實體
  8. 點擊「Next」
  9. 選擇項目目錄「CoreData」,在下面的「Group」中,選擇項目目錄「CoreData」
  10. 保存

注意:html

  • 實體的屬性名稱,首字母必須小寫。咱們可使用駱駝命名法對實體的屬性進行命名。
  • 在生成完成Entity子類後,打開子類文件,查看子類的標題上方是否有@objc(EntityName)標記,若是沒有,就加上。若是不加上,在使用上下文對象時,會提示找不到實體類。

初始化環境

由於咱們在建立項目的時候勾選了使用Use Core Data,因此在項目中的AppDelegate.swift文件中,咱們能夠看到Xcode已經完成對NSManagedObjectContextNSManagedObjectModelNSPersistentStoreCoordinator以及用於存儲的.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()
}

參考

相關文章
相關標籤/搜索