1.Core Data classes
NSManagedObjectModel:用來(lái)創(chuàng)建數(shù)據(jù)模型,存儲(chǔ)屬性和保存數(shù)據(jù)。有個(gè)特殊的 編譯器momc把工程的.xcdatamodel的文件編輯為一組momd文件 coredata用這組momd文件來(lái)初始化NSManagedObjectModel
NSPersistentStore: 對(duì)存儲(chǔ)區(qū)進(jìn)行讀寫操作。Coredata可根據(jù)需要將數(shù)據(jù)保存為指定的方 式包括NSQLiteStoreType、NSXMLStoreType、NSBinaryStoreType、NSInMemoryStoreType。根據(jù)名稱可以看出保存的文件類型。大部分使用的是sqlite類型也是默認(rèn)類型,是唯一的非原子類型(non- atomic),其他的三種都為原子類型(atomic)。InMemory類型不能對(duì)數(shù)據(jù)進(jìn)行持久化保存只是保存在內(nèi)存中,其他三種可以。
NSPersistentStoreCoordinator:NSPersistentStoreCoordinator將object model和persistent store進(jìn)行關(guān)聯(lián)。向object model發(fā)送信息及從persistent store獲取信息
NSManagedObjectContext: 用到的最多的一個(gè)類Coredata的大部分操作都用NSManagedObjectContext來(lái)完成在內(nèi)存中保存只有調(diào)用save()方法的時(shí)候才會(huì)將數(shù)據(jù)保存到disk。每個(gè)managed object都必須擁有一個(gè)context,并一直保持對(duì)他的引用。一個(gè)程序可以有多個(gè)context,可以使用context同時(shí)對(duì)Coredata進(jìn)行操作。
2.手動(dòng)創(chuàng)建CoreData(在創(chuàng)建項(xiàng)目的時(shí)候不勾選CoreData 而是自己創(chuàng)建)
let modelName = "My Coredata"
private lazy var applicationDocumentsDirectory: NSURL = {
let urls = NSFileManager.defaultManager().URLsForDirectory(
.DocumentDirectory, inDomains: .UserDomainMask)
return urls[0]
}()
//創(chuàng)建NSManagedObjectContext
lazy var context: NSManagedObjectContext = {
var managedObjectContext = NSManagedObjectContext(
concurrencyType: .MainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = self.persistentStoreCoordinator
return managedObjectContext
}()
//創(chuàng)建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
}()
//創(chuàng)建NSManagedObjectModel
private lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = NSBundle.mainBundle().URLForResource(self.modelName,
withExtension: "momd")!
return NSManagedObjectModel(contentsOfURL: modelURL)!
}()
//將數(shù)據(jù)保存
func saveContext () {
if context.hasChanges {
do {
try context.save()
} catch let error as NSError {print("Error: \(error.localizedDescription)")abort()
}
}
}
注:lazy延遲屬性只有在使用該變量的時(shí)候才會(huì)進(jìn)行初始化。大括號(hào)里面是一個(gè)block,將處理結(jié)果返回給變量給變量賦值
3.使用
//獲取上面創(chuàng)建的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
}
//進(jìn)入后臺(tái)時(shí)保存數(shù)據(jù)
func applicationDidEnterBackground(application: UIApplication) {
coreDataStack.saveContext()
}
注:數(shù)據(jù)的保存和讀取與CoreData(一)中的方法相同 只是自己創(chuàng)建了context而不是使用Appdelegate中自動(dòng)創(chuàng)建的context。