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_无法找到对应实体类问题)
代码如下:
- 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?
-
-
- 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
- }
-
-
- func applicationWillResignActive(application: UIApplication) {
- self.saveContext()
- }
-
-
- func applicationDidEnterBackground(application: UIApplication) {
- self.saveContext()
- }
-
-
- func applicationWillEnterForeground(application: UIApplication) {
- }
-
-
- func applicationDidBecomeActive(application: UIApplication) {
- }
-
-
- func applicationWillTerminate(application: UIApplication) {
- self.saveContext()
- }
-
-
-
-
- lazy var applicationDocumentsDirectory: NSURL = {
-
- let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
- return urls[urls.count-1] as NSURL
- }()
-
-
-
-
- lazy var managedObjectModel: NSManagedObjectModel = {
-
- let modelURL = NSBundle.mainBundle().URLForResource("PKO_Sample_CoreDataBooks", withExtension: "momd")!
- return NSManagedObjectModel(contentsOfURL: modelURL)!
-
- }()
-
-
-
- lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {
- var fileManager = NSFileManager.defaultManager()
-
- var storeURL = self.applicationDocumentsDirectory.URLByAppendingPathComponent("PKO_swift_coreDataBooks.sqlite")
-
-
- 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)
- }
- }
-
-
- var options = [NSMigratePersistentStoresAutomaticallyOption:true, NSInferMappingModelAutomaticallyOption:true]
-
- var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
- var error: NSError? = nil
-
- if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: options, error: &error) == nil {
- coordinator = nil
- NSLog("Unresolved error \(error), \(error!.userInfo)")
- abort()
- }
- return coordinator
- }()
-
-
-
- lazy var managedObjectContext: NSManagedObjectContext? = {
- let coordinator = self.persistentStoreCoordinator
- if coordinator == nil {
- return nil
- }
- var managedObjectContext = NSManagedObjectContext()
- managedObjectContext.persistentStoreCoordinator = coordinator
- return managedObjectContext
- }()
-
-
-
-
- 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