CoreData(二)---创建stack

作者: xiaocheche | 来源:发表于2016-01-07 14:22 被阅读99次

    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

        本文链接:https://www.haomeiwen.com/subject/ihefkttx.html