CoreData(二)---創建stack

1.Core Data classes

NSManagedObjectModel:用來創建數據模型,存儲屬性和保存數據。有個特殊的 編譯器momc把工程的.xcdatamodel的文件編輯為一組momd文件 coredata用這組momd文件來初始化NSManagedObjectModel

NSPersistentStore: 對存儲區進行讀寫操作。Coredata可根據需要將數據保存為指定的方 式包括NSQLiteStoreType、NSXMLStoreType、NSBinaryStoreType、NSInMemoryStoreType。根據名稱可以看出保存的文件類型。大部分使用的是sqlite類型也是默認類型,是唯一的非原子類型(non- atomic),其他的三種都為原子類型(atomic)。InMemory類型不能對數據進行持久化保存只是保存在內存中,其他三種可以。

NSPersistentStoreCoordinator:NSPersistentStoreCoordinator將object model和persistent store進行關聯。向object model發送信息及從persistent store獲取信息

NSManagedObjectContext: 用到的最多的一個類Coredata的大部分操作都用NSManagedObjectContext來完成在內存中保存只有調用save()方法的時候才會將數據保存到disk。每個managed object都必須擁有一個context,并一直保持對他的引用。一個程序可以有多個context,可以使用context同時對Coredata進行操作。

2.手動創建CoreData(在創建項目的時候不勾選CoreData 而是自己創建)

let modelName = "My Coredata"
    private lazy var applicationDocumentsDirectory: NSURL = {
    let urls = NSFileManager.defaultManager().URLsForDirectory(
    .DocumentDirectory, inDomains: .UserDomainMask)
    return urls[0]
    }()
    
    //創建NSManagedObjectContext
    lazy var context: NSManagedObjectContext = {
        var managedObjectContext = NSManagedObjectContext(
        concurrencyType: .MainQueueConcurrencyType)
    
    managedObjectContext.persistentStoreCoordinator = self.persistentStoreCoordinator
    return managedObjectContext
    }()
    //創建NSPersistentStoreCoordinator
    private lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
        let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
        let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent(self.modelName)
        do {
            let options = [NSMigratePersistentStoresAutomaticallyOption : true]
            try coordinator.addPersistentStoreWithType( NSSQLiteStoreType, configuration: nil, URL: url, options: options)
    } catch {
            print("Error adding persistent store.")
        }
        return coordinator
    }()
    
    //創建NSManagedObjectModel
    private lazy var managedObjectModel: NSManagedObjectModel = {
        let modelURL = NSBundle.mainBundle().URLForResource(self.modelName,
        withExtension: "momd")!
        return NSManagedObjectModel(contentsOfURL: modelURL)!
    }()

  //將數據保存
   func saveContext () {
      if context.hasChanges {
         do {
               try context.save()
             } catch let error as NSError {print("Error: \(error.localizedDescription)")abort()
         }
       }
    }

注:lazy延遲屬性只有在使用該變量的時候才會進行初始化。大括號里面是一個block,將處理結果返回給變量給變量賦值

3.使用

//獲取上面創建的contex
func application(application: UIApplication,didFinishLaunchingWithOptionslaunchOptions: [NSObject: AnyObject]?) -> Bool {
let navigationController =window!.rootViewController as! UINavigationController
let viewController =navigationController.topViewController as! ViewController
viewController.managedContext = coreDataStack.context
return true
}

//進入后臺時保存數據
func applicationDidEnterBackground(application: UIApplication) {
coreDataStack.saveContext()
}

注:數據的保存和讀取與CoreData(一)中的方法相同 只是自己創建了context而不是使用Appdelegate中自動創建的context。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容