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。

你可能感兴趣的:(CoreData(二)---创建stack)