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。