Swift教程_CoreData实例(一)_构建storyboard
Swift教程_CoreData实例(二)_构建数据层
Swift教程_CoreData实例(三)_构建控制层(列表数据加载、删除数据)
Swift教程_CoreData实例(四)_构建控制层(查询、更新数据)
Swift教程_CoreData实例(五)_构建控制层(添加数据)
数据层总体结构包括由CoreData构建的数据模型、通过AppDelegate构建相应的初始化对象。
coredata数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型。
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_无法找到对应实体类问题)
代码如下:
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() } } } }