Swift教程_CoreData实例(一)_构建storyboard
Swift教程_CoreData实例(二)_构建数据层
Swift教程_CoreData实例(三)_构建控制层(列表数据加载、删除数据)
Swift教程_CoreData实例(四)_构建控制层(查询、更新数据)
Swift教程_CoreData实例(五)_构建控制层(添加数据)
三、构建数据层
数据层总体结构包括由CoreData构建的数据模型、通过AppDelegate构建相应的初始化对象。
coredata数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型。
1.构建数据模型
1.在xcdatamodeld文件添加一个实体entity,并为其添加三个属性,如下图:
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_无法找到对应实体类问题)
代码如下:
[objc] view plain copy
- 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代码如下(注释写的很清楚):
[objc] view plain copy
- 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()
- }
- }
- }
- }
原文地址:http://blog.csdn.net/ooppookid/article/details/40745191