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

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

  1. import Foundation  
  2. import CoreData  
  3.   
  4. @objc(Book)  
  5. class Book: NSManagedObject {  
  6.   
  7.     @NSManaged var author: String  
  8.     @NSManaged var title: String  
  9.     @NSManaged var theDate: NSDate  
  10.   
  11. }  

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

  1. import UIKit  
  2. import CoreData  
  3.   
  4. @UIApplicationMain  
  5. class CoreDataBooksAppDelegate: UIResponder, UIApplicationDelegate {  
  6.       
  7.     var window: UIWindow?  
  8.       
  9.     //app开始启动时调用  
  10.     func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {  
  11.         var navigationViewController = self.window?.rootViewController as UINavigationController  
  12.         var booksTableViewController = navigationViewController.viewControllers[0] as PKOBooksTableViewController  
  13.         booksTableViewController.managedObjectContext = self.managedObjectContext  
  14.         return true  
  15.     }  
  16.       
  17.     //app将要入非活动状态时调用,在此期间,应用程序不接收消息或事件,比如来电话了;保存数据  
  18.     func applicationWillResignActive(application: UIApplication) {  
  19.         self.saveContext()  
  20.     }  
  21.       
  22.     //app被推送到后台时调用,所以要设置后台继续运行,则在这个函数里面设置即可;保存数据  
  23.     func applicationDidEnterBackground(application: UIApplication) {  
  24.         self.saveContext()  
  25.     }  
  26.       
  27.     //app从后台将要重新回到前台非激活状态时调用  
  28.     func applicationWillEnterForeground(application: UIApplication) {  
  29.     }  
  30.       
  31.     //app进入活动状态执行时调用  
  32.     func applicationDidBecomeActive(application: UIApplication) {  
  33.     }  
  34.       
  35.     //app将要退出是被调用,通常是用来保存数据和一些退出前的清理工作;保存数据  
  36.     func applicationWillTerminate(application: UIApplication) {  
  37.         self.saveContext()  
  38.     }  
  39.       
  40.     // MARK: - Core Data stack ,coreData所用  
  41.       
  42.     //应用程序沙箱下的Documents目录路径,自动生成,无需修改  
  43.     lazy var applicationDocumentsDirectory: NSURL = {  
  44.         //NSSearchPathDirectory.DocumentDirectory,可以省略前面的类名  
  45.         let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)  
  46.         return urls[urls.count-1] as NSURL  
  47.         }()  
  48.       
  49.     //NSManagedObjectModel(数据模型),数据库所有模型,包含各实体的定义信息  
  50.     //作用:添加实体的属性,建立属性之间的关系  
  51.     //操作方法:视图编辑器,或代码  
  52.     lazy var managedObjectModel: NSManagedObjectModel = {  
  53.         //xcdatamodeld编译后为momd  
  54.         let modelURL = NSBundle.mainBundle().URLForResource("PKO_Sample_CoreDataBooks", withExtension: "momd")!  
  55.         return NSManagedObjectModel(contentsOfURL: modelURL)!  
  56.           
  57.         }()  
  58.       
  59.     //NSPersistentStoreCoordinator(持久化存储连接器),相当于数据库的连接器,大部分都是自动生成,可以自行调整  
  60.     //作用:设置数据存储的名字,位置,存储方式,和存储时机  
  61.     lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {  
  62.         var fileManager = NSFileManager.defaultManager()  
  63.         //sqlite的库路径  
  64.         var storeURL = self.applicationDocumentsDirectory.URLByAppendingPathComponent("PKO_swift_coreDataBooks.sqlite")  
  65.         //应用程序沙箱目录中的sqlite文件是否已经存在,如果它不存在(即应用程序第一次运行),则将包中的sqlite文件复制到沙箱文件目录。即加载初始化库数据  
  66.         //若想重新在模拟器(simulator)中重新使用该sqlite初始化,点击IOS Simulator->Reset Contents and Settings,重置模拟器即可  
  67.         if !fileManager.fileExistsAtPath(storeURL.path!){  
  68.             var defaultStoreURL = NSBundle.mainBundle().URLForResource("PKO_swift_coreDataBooks", withExtension: "sqlite")  
  69.             if (defaultStoreURL != nil) {  
  70.                 fileManager.copyItemAtURL(defaultStoreURL!, toURL: storeURL, error: nil)  
  71.             }  
  72.         }  
  73.         //NSMigratePersistentStoresAutomaticallyOption是否自动迁移数据,  
  74.         //NSInferMappingModelAutomaticallyOption是否自动创建映射模型  
  75.         var options = [NSMigratePersistentStoresAutomaticallyOption:true, NSInferMappingModelAutomaticallyOption:true]  
  76.         // 根据managedObjectModel创建coordinator  
  77.         var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)  
  78.         var error: NSError? = nil  
  79.         // 指定持久化存储的数据类型,默认的是NSSQLiteStoreType,即SQLite数据库  
  80.         if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: options, error: &error) == nil {  
  81.             coordinator = nil  
  82.             NSLog("Unresolved error \(error), \(error!.userInfo)")  
  83.             abort()  
  84.         }  
  85.         return coordinator  
  86.         }()  
  87.       
  88.     //NSManagedObjectContext(数据上下文),操作实际内容(操作持久层)  
  89.     //作用:插入数据,查询数据,删除数据  
  90.     lazy var managedObjectContext: NSManagedObjectContext? = {  
  91.         let coordinator = self.persistentStoreCoordinator  
  92.         if coordinator == nil {  
  93.             return nil  
  94.         }  
  95.         var managedObjectContext = NSManagedObjectContext()  
  96.         managedObjectContext.persistentStoreCoordinator = coordinator  
  97.         return managedObjectContext  
  98.         }()  
  99.       
  100.     // MARK: - Core Data Saving support  
  101.       
  102.     //持久化数据,数据落地  
  103.     func saveContext () {  
  104.         if let moc = self.managedObjectContext {  
  105.             var error: NSError? = nil  
  106.             if moc.hasChanges && !moc.save(&error) {  
  107.                 NSLog("Unresolved error \(error), \(error!.userInfo)")  
  108.                 abort()  
  109.             }  
  110.         }  
  111.     }  
  112.       
  113. }  

原文地址:http://blog.csdn.net/ooppookid/article/details/40745191

时间: 2024-10-30 18:34:19

Swift教程_CoreData实例(二)_构建数据层的相关文章

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

Swift教程_CoreData实例(一)_构建storyboard Swift教程_CoreData实例(二)_构建数据层 Swift教程_CoreData实例(三)_构建控制层(列表数据加载.删除数据) Swift教程_CoreData实例(四)_构建控制层(查询.更新数据) Swift教程_CoreData实例(五)_构建控制层(添加数据) 2.查询数据 我们自定义一个列表控制器PKOBookDetailTableViewController,并应用到storyboard的明细显示view

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

Swift教程_CoreData实例(一)_构建storyboard Swift教程_CoreData实例(二)_构建数据层 Swift教程_CoreData实例(三)_构建控制层(列表数据加载.删除数据) Swift教程_CoreData实例(四)_构建控制层(查询.更新数据) Swift教程_CoreData实例(五)_构建控制层(添加数据) 四.构建控制层 控制层总体结构包括列表的数据加载.数据的新增.删除.更新.这里我们先来搞定列表controller的功能(数据加载.删除),即PKOB

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

Swift教程_CoreData实例(一)_构建storyboard Swift教程_CoreData实例(二)_构建数据层 Swift教程_CoreData实例(三)_构建控制层(列表数据加载.删除数据) Swift教程_CoreData实例(四)_构建控制层(查询.更新数据) Swift教程_CoreData实例(五)_构建控制层(添加数据) 4.添加数据 我们自定义一个列表控制器PKOBookAddTableViewController,并应用到storyboard的添加显示view中,用

[置顶] Swift教程_CoreData实例(一)_构建storyboard

Swift教程_CoreData实例(一)_构建storyboard Swift教程_CoreData实例(二)_构建数据层 Swift教程_CoreData实例(三)_构建控制层(列表数据加载.删除数据) Swift教程_CoreData实例(四)_构建控制层(查询.更新数据) Swift教程_CoreData实例(五)_构建控制层(添加数据) 一.概述 文本用swift语言,使用coreData做一个实例,用来学习通过swift使用coreData的方法.以下是实现的效果,包含了增删改查功能

Swift教程_零基础学习Swift完整实例(五)_swift完整实例(构建数据层)

3.构建数据层 按照官方sample,我们使用简单的plist来保存数据(当然使用内置数据库也ok).该plist既是我们列表中需要显示的内容. 1.将化学元素的数据整理为Elements.plist,该plist的结构为Array<Dictionary>(Java表示为ArrayList<Map<String,Object>>). dictionary中包含若干键值对,但一定要保证每个dictionary键值对的键和值的类型一致,这样我们才能够进行数据的解析.如图.

ASP.NET 2.0数据教程之七十二:对数据访问层进行“连接—命令”级的设置

返回"ASP.NET 2.0数据教程目录" 导言: 在本系列我们用类型化的DataSets来构建数据访问层.就像在 第一章探讨的那样,类型化DataSets的DataTables用作存储数据的"仓库 ",而TableAdapters作为连接数据库的通道,以检索.修改数 据.TableAdapters 将处理数据库的很多复杂的细节进行了封装,将我们解脱出来 ,免去了写代码连接数据库.发出命名.向DataTable填充数据的痛苦. 不 过在某些时候我们需要深入的探究Ta

ASP.NET 2.0数据教程之四十二:为删除数据添加客户端确认

返回"ASP.NET 2.0数据教程目录" 如我们在综叙:在DataList里编辑和删除数据 里看到的,为DataList添加 删除功能可以通过以下完成: 在ItemTemplate里添加Button, LinkButton, 或ImageButton 将Delete button的 CommandName 设为 "Delete" 在DeleteCommand事件处理里调用合适的BLL delete方法 (然后重新绑定数据,来让刚删除的项不再在DataList里显示

Swift教程_零基础学习Swift完整实例(四)_swift完整实例(搭建程序结构、构建storyboard)

四.swift重写Sample 本章开始进入正题,笔者将分搭建程序结构.构建storyboard.构建数据层.构建展示层.构建控制层.添加View的阴影.添加View的动画效果七个部分来对官方Sample的Element工程进行重写,其中涉及到的问题会给出分析和说明.不太了解storyboard的请参考官方教程<Start Developing iOS Apps Today> 1.搭建程序结构 对于程序的目录结构,完全是按照我个人的习惯所创建,由于结构对编译运行没有任何影响,是完全面向开发者的

Swift教程_零基础学习Swift完整实例(六)_swift完整实例(构建控制层)

4.构建控制层 本章节主要来构建个功能的控制层,为之前已经创建好的storyboard中页面的自定义controller添加对应功能. 1.TabBarViewController 该控制器按照需求通过数据层服务类PKOElementDataService所构建的实现了PKOTableDataSourceProtocol与UITableViewDataSource协议的4类数据集dataSource,并将他们赋值给tab种所展示view的控制器,即PKOElementTableViewContr