Swift教程_CoreData实例(二)_构建数据层

Swift教程_CoreData实例(一)_构建storyboard

Swift教程_CoreData实例(二)_构建数据层

Swift教程_CoreData实例(三)_构建控制层(列表数据加载、删除数据)

Swift教程_CoreData实例(四)_构建控制层(查询、更新数据)

Swift教程_CoreData实例(五)_构建控制层(添加数据)


三、构建数据层

数据层总体结构包括由CoreData构建的数据模型、通过AppDelegate构建相应的初始化对象。

coredata数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型。

1.构建数据模型

1.在xcdatamodeld文件添加一个实体entity,并为其添加三个属性,如下图:
Swift教程_CoreData实例(二)_构建数据层_第1张图片

2.根据xcdatamodeld中的实体生成对应的实体模型类。选中xcdatamodeld->Editor->Create NSManagedObject SubClass,创建后会发现对应属性带有@NSManaged这个声明。

这里注意,一定要在类上声明@objc(Book),不然会报找不到类的错误:CoreData: warning: Unable to load class named 'Book' for entity 'Book'. Class not found, using default NSManagedObject instead. (创建实体类时自动生成对应@objc声明的教程,请看swift教程_swift开发CoreData_无法找到对应实体类问题)

代码如下:

import Foundation
import CoreData

@objc(Book)
class Book: NSManagedObject {

    @NSManaged var author: String
    @NSManaged var title: String
    @NSManaged var theDate: NSDate

}

3.在AppDelegate中,需要初始化coredata的对象,我们简单了解下coredata的类功能,该段为网络资源,做了部分更新和修改。
(1)NSManagedObjectContext(数据上下文)
操作实际内容(操作持久层)
作用:插入数据,查询数据,删除数据
(2)NSManagedObjectModel(数据模型)
数据库所有数据结构,包含各实体的定义信息,相当于表
作用:添加实体的属性,建立属性之间的关系
(3)NSPersistentStoreCoordinator(持久化存储连接器)
相当于数据库的连接器
作用:设置数据存储的名字,位置,存储方式,和存储时机
(4)NSManagedObject(数据记录)
相当于数据库中的表记录
(5)NSFetchRequest(数据请求)
相当于查询语句
(6)NSEntityDescription(实体结构)
相当于表结构
(7)后缀为.xcdatamodeld的文件
里面是.xcdatamodel文件,用数据模型编辑器编辑
编译后为.momd或.mom文件
关系如下图:


具体AppDelegate代码如下(注释写的很清楚):

import UIKit
import CoreData

@UIApplicationMain
class CoreDataBooksAppDelegate: UIResponder, UIApplicationDelegate {
    
    var window: UIWindow?
    
    //app开始启动时调用
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        var navigationViewController = self.window?.rootViewController as UINavigationController
        var booksTableViewController = navigationViewController.viewControllers[0] as PKOBooksTableViewController
        booksTableViewController.managedObjectContext = self.managedObjectContext
        return true
    }
    
    //app将要入非活动状态时调用,在此期间,应用程序不接收消息或事件,比如来电话了;保存数据
    func applicationWillResignActive(application: UIApplication) {
        self.saveContext()
    }
    
    //app被推送到后台时调用,所以要设置后台继续运行,则在这个函数里面设置即可;保存数据
    func applicationDidEnterBackground(application: UIApplication) {
        self.saveContext()
    }
    
    //app从后台将要重新回到前台非激活状态时调用
    func applicationWillEnterForeground(application: UIApplication) {
    }
    
    //app进入活动状态执行时调用
    func applicationDidBecomeActive(application: UIApplication) {
    }
    
    //app将要退出是被调用,通常是用来保存数据和一些退出前的清理工作;保存数据
    func applicationWillTerminate(application: UIApplication) {
        self.saveContext()
    }
    
    // MARK: - Core Data stack ,coreData所用
    
    //应用程序沙箱下的Documents目录路径,自动生成,无需修改
    lazy var applicationDocumentsDirectory: NSURL = {
        //NSSearchPathDirectory.DocumentDirectory,可以省略前面的类名
        let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
        return urls[urls.count-1] as NSURL
        }()
    
    //NSManagedObjectModel(数据模型),数据库所有模型,包含各实体的定义信息
    //作用:添加实体的属性,建立属性之间的关系
    //操作方法:视图编辑器,或代码
    lazy var managedObjectModel: NSManagedObjectModel = {
        //xcdatamodeld编译后为momd
        let modelURL = NSBundle.mainBundle().URLForResource("PKO_Sample_CoreDataBooks", withExtension: "momd")!
        return NSManagedObjectModel(contentsOfURL: modelURL)!
        
        }()
    
    //NSPersistentStoreCoordinator(持久化存储连接器),相当于数据库的连接器,大部分都是自动生成,可以自行调整
    //作用:设置数据存储的名字,位置,存储方式,和存储时机
    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {
        var fileManager = NSFileManager.defaultManager()
        //sqlite的库路径
        var storeURL = self.applicationDocumentsDirectory.URLByAppendingPathComponent("PKO_swift_coreDataBooks.sqlite")
        //应用程序沙箱目录中的sqlite文件是否已经存在,如果它不存在(即应用程序第一次运行),则将包中的sqlite文件复制到沙箱文件目录。即加载初始化库数据
        //若想重新在模拟器(simulator)中重新使用该sqlite初始化,点击IOS Simulator->Reset Contents and Settings,重置模拟器即可
        if !fileManager.fileExistsAtPath(storeURL.path!){
            var defaultStoreURL = NSBundle.mainBundle().URLForResource("PKO_swift_coreDataBooks", withExtension: "sqlite")
            if (defaultStoreURL != nil) {
                fileManager.copyItemAtURL(defaultStoreURL!, toURL: storeURL, error: nil)
            }
        }
        //NSMigratePersistentStoresAutomaticallyOption是否自动迁移数据,
        //NSInferMappingModelAutomaticallyOption是否自动创建映射模型
        var options = [NSMigratePersistentStoresAutomaticallyOption:true, NSInferMappingModelAutomaticallyOption:true]
        // 根据managedObjectModel创建coordinator
        var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
        var error: NSError? = nil
        // 指定持久化存储的数据类型,默认的是NSSQLiteStoreType,即SQLite数据库
        if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: options, error: &error) == nil {
            coordinator = nil
            NSLog("Unresolved error \(error), \(error!.userInfo)")
            abort()
        }
        return coordinator
        }()
    
    //NSManagedObjectContext(数据上下文),操作实际内容(操作持久层)
    //作用:插入数据,查询数据,删除数据
    lazy var managedObjectContext: NSManagedObjectContext? = {
        let coordinator = self.persistentStoreCoordinator
        if coordinator == nil {
            return nil
        }
        var managedObjectContext = NSManagedObjectContext()
        managedObjectContext.persistentStoreCoordinator = coordinator
        return managedObjectContext
        }()
    
    // MARK: - Core Data Saving support
    
    //持久化数据,数据落地
    func saveContext () {
        if let moc = self.managedObjectContext {
            var error: NSError? = nil
            if moc.hasChanges && !moc.save(&error) {
                NSLog("Unresolved error \(error), \(error!.userInfo)")
                abort()
            }
        }
    }
    
}

点击进入ooppookid的博客

你可能感兴趣的:(ios,sqlite,技术,swift,coredata)