新書推薦:
《
海外中国研究·王羲之:六朝贵族的世界(艺术系列)
》
售價:HK$
182.9
《
唐宋绘画史 全彩插图版
》
售價:HK$
101.2
《
“御容”与真相:近代中国视觉文化转型(1840-1920)
》
售價:HK$
113.9
《
鸣沙丛书·大风起兮:地方视野和政治变迁中的“五四”(1911~1927)
》
售價:HK$
102.4
《
海洋、岛屿和革命:当南方遭遇帝国(文明的另一种声音)
》
售價:HK$
109.3
《
铝合金先进成型技术
》
售價:HK$
273.7
《
英雄之旅:把人生活成一个好故事
》
售價:HK$
89.7
《
分析性一体的涌现:进入精神分析的核心
》
售價:HK$
125.4
|
編輯推薦: |
本书是关东升老师针对iOS入门读者精心编写的iOS实战四大宝典之一,通过这四本书,真正实现零基础到APP上架,步入移动开发殿堂。
《iOS实战:入门与提高卷(Swift版)》
《iOS实战:图形图像、动画和多媒体卷(Swift版)》
《iOS实战:传感器卷(Swift版)》
《iOS实战:苹果生态圈编程卷(Swift版)》
|
內容簡介: |
本书是智捷课堂团队编著的“iOS实战”系列图书中的一本,本书系统介绍了苹果产品“生态圈”的相关知识。全书共分为13章,分别介绍了苹果网络编程、Core Data技术、iCloud编程、推送通知、社交网络编程、Newsstand、应用内购买、Passbook、HomeKit、Handoff、定位服务和地图应用开发。书中全部采用基于iOS 8的最新API。
本书适合作为从事iOS应用开发的软件工程师的参考用书,也可以作为计算机科学与技术、软件工程等专业移动开发类课程的教学用书。
|
關於作者: |
关东升 国内知名iOS技术作家,iOS技术顾问,高级培训讲师,移动开发专家。担任51CTO社区iOS技术顾问,精通iOS、Android和Windows Phone及HTML5等移动开发技术。曾先后主持开发大型网络游戏《神农诀》的iOS和Android客户端开发,国家农产品追溯系统的iPad客户端开发,酒店预订系统的iOS客户端开发,金融系统的iOS、Windows Phone 及Android客户端开发。在App Store上发布数款游戏和应用软件,擅长移动平台的应用和游戏类项目开发。长期为中国移动研究院、云南移动、东软、方正科技、大唐电信、中石油、深圳康拓普、上海财富168、天津港务局等企事业单位授课。著有《iOS网络编程与云端应用最佳实践》、《iOS传感器应用开发最佳实践》、《iOS开发指南从零基础到App Store上架》、《交互设计的艺术iOS 7拟物化到扁平化革命》、《Cocos2d-x实战:C 卷》、《Cocos2d-x实战:Lua卷》、《Cocos2d-x实战:工具卷》、《Cocos2d-x实战:JS卷Cocos2d-JS开发》等专业图书。
|
目錄:
|
第1章 准备开始
1.1 本书结构
1.2 本书中的约定
1.2.1 实例代码约定
1.2.2 图示约定
1.2.3 图中手势
1.2.4 方法命名约定
1.2.5 构造器命名约定
第2章 苹果网络
2.1 网络结构
2.1.1 客户端服务器结构网络
2.1.2 对等结构网络
2.2 基于Socket的C/S结构网络通信
2.2.1 Socket概念
2.2.2 Socket编程
2.2.3 实例:CFStream实现TCP Socket服务器端
2.2.4 实例:NSStream实现TCP Socket客户端
2.3 Bonjour服务发现
2.3.1 发布服务
2.3.2 解析服务
2.3.3 查找服务
2.3.4 实例:基于服务发现的Socket通信服务器端
2.3.5 实例:基于服务发现的Socket通信客户端
2.4 对等结构网络
2.4.1 使用Multipeer Connectivity开发对等结构网络应用
2.4.2 实例:P2PGame游戏
本章小结
第3章 Core Data数据持久化技术
3.1 对象关系映射
3.2 Core Data堆栈
3.3 建模和生成实体
3.3.1 建模
3.3.2 生成实体
3.4 实例:采用Core Data实现MyNotes应用
3.4.1 采用Core Data分层架构设计
3.4.2 查询数据
3.4.3 修改数据
本章小结
第4章iCloud编程
4.1 苹果云服务——iCloud
4.2 键值数据存储
4.2.1 键值数据存储编程
4.2.2 实例:iCloud键值数据存储
4.3 文档存储
4.3.1 iCloud存储运行过程
4.3.2 实例:iCloud文档存储编程
4.4 iCloud Core Data技术
4.4.1 实例:iCloud Core Data实现MyNotes应用
4.4.2 配置Xcode工程
4.4.3 修改持久化存储协调者
4.4.4 修改被管理的对象上下文
4.4.5 合并iCloud数据
4.4.6 更新UI
4.5 CloudKit存储编程
4.5.1 CloudKit术语
4.5.2 iCloud Dashboard
4.5.3 实例:CloudKit实现MyNotes应用
本章小结
第5章 推送通知
……
第6章 社交网络编程
第7章 报刊杂志——Newsstand应用编程
第8章 应用内购买
第9章 Passbook开发
第10章 智能家居与HomeKit编程
第11章 Handoff编程
第12章 定位
第13章 地图应用开发
|
內容試閱:
|
第3章Core Data数据持久化技术Core Data是苹果为OS X和iOS系统应用开发提供的数据持久化技术。它基于高级数据持久化API,它的底层最终是SQLite数据库、二进制文件和内存数据保存,这样开发人员不用再关心数据的存储细节问题,不用再使用SQL语句,不用面对SQLite的C语言函数。3.1对象关系映射Core Data是一种对象关系映射Object Relational Mapping,ORM技术。听说过HibernateHibernate是一个开放源代码的对象关系映射Java EE框架。的人对对象关系映射不会感到陌生,对象关系映射是关系数据模型和对象模型类之间的一个纽带。
图31对象关系映射
无论哪一种模型,都是为了描述和构建应用系统。在应用系统中,一个基本的概念是实体。实体是应用系统中的人、事和物,它们能够在构造关系模型和对象模型中以不同的形态存在。如图31所示,实体在关系模型中代表表的一条数据,该表描述了实体的结构有哪些属性和关系。实体在对象模型中代表类的一个对象,类描述了实体的结构,实体是类的对象。因此,表是与类对应的概念,记录是与对象对应的概念。
关系模型和对象模型是有区别的,对象模型更加先进,能够描述继承、实现、关联、聚合和组成等复杂的关系,而关系模型只能描述一对一、一对多和多对多的关系。这两种模型之间的不和谐称为阻抗不匹配问题,而对象关系映射可以解决阻抗不匹配问题。3.2Core Data堆栈使用Xcode工具,可以很方便地为工程添加Core Data支持。在Xcode的工程模板中,有两个模板MasterDetail Application和Single View Application模板可以直接为工程添加Core Data支持,具体方法是创建工程时,选中Use Core Data复选框,如图32所示。
图32添加Core Data支持
其他的模板需要自己添加Core Data支持。下面看看通过模板生成的代码,这些代码主要生成在AppDelegate中。AppDelegate.swift中的主要代码如下:
import UIKit
import CoreData
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
MARK: - Core Data 堆栈
lazy var managedObjectModel: NSManagedObjectModel = {①
}
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {②
}
lazy var managedObjectContext: NSManagedObjectContext? = { ③
}
}
在AppDelegate.swift中,代码第①行定义了NSManagedObjectModel类型的属性,代码第②行定义了NSPersistentStoreCoordinator类型的属性,代码第③行定义了NSManagedObjectContext类型的属性。上述属性的类型含义如下所示:□NSManagedObjectContext。它是被管理对象上下文Managed Object Context,MOC类,在上下文中可以查找、删除和插入对象,然后通过Core Data堆栈同步到持久化对象存储。□NSManagedObjectModel。它是被管理对象模型Managed Object Model,MOM类,是系统中的实体,与数据库中的表等对象对应。□NSPersistentStoreCoordinator。它是持久化存储协调器Persistent Store Coordinator, PSC类,在持久化对象存储之上提供了一个接口,可以把它考虑成为数据库的连接。除了上述3个概念外,还有持久化对象存储,它们一起构成了Core Data堆栈。持久化对象存储Persistent Object Store,POS执行所有底层的从对象到数据的转换,并负责打开和关闭数据文件。它有3种持久化实现方式: SQLite、二进制文件和内存形式。Core Data堆栈如图33所示,有一个或多个被管理对象上下文,它连接到一个持久化存储协调器。一个持久化存储协调器连接到一个或多个持久化对象存储。持久化对象存储与底层存储文件关联。一个持久化存储协调器也可以管理多个被管理对象模型。一个持久化存储协调器就意味着一个Core Data堆栈。通过Core Data堆栈,可以实现数据查询、插入、删除和修改等操作。
下面看看AppDelegate.swift中的saveContext方法,其代码如下所示:
func saveContext {
if let moc = self.managedObjectContext {
var error: NSError? = nil
if moc.hasChanges !moc.saveerror {
NSLog"Unresolved error \error, \error!.userInfo"
abort
}
}
}
图33Core Data堆栈
当插入、删除和修改数据之后,需要通过该方法保存被管理对象上下文,其中self.managedObjectContext{}语句是保存上下文的核心语句。在AppDelegate.swift中,applicationDocumentsDirectory方法的代码如下:
lazy var applicationDocumentsDirectory: NSURL = {
let urls = NSFileManager.defaultManager.URLsForDirectory.DocumentDirectory,
inDomains: .UserDomainMask
return urls[urls.count-1] as NSURL
}
该方法返回应用程序沙箱Documents目录,它的返回类型是NSURL。在AppDelegate.swift中,Core Data堆栈的方法如下:
返回被管理对象上下文
lazy var managedObjectContext: NSManagedObjectContext? = {①
let coordinator = self.persistentStoreCoordinator②
if coordinator == nil {
return nil
}
var managedObjectContext = NSManagedObjectContext③
managedObjectContext.persistentStoreCoordinator = coordinator④
return managedObjectContext
}
返回持久化存储协调器
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {⑤
var coordinator: NSPersistentStoreCoordinator?
= NSPersistentStoreCoordinatormanagedObjectModel: self.managedObjectModel⑥
let url = self.applicationDocumentsDirectory
.URLByAppendingPathComponent"xcdatamodeld文件.sqlite"
var error: NSError? = nil
var failureReason = "There was an error creating or loading the application''s saved data."
if coordinator!.addPersistentStoreWithTypeNSSQLiteStoreType,
configuration: nil, URL: url, options: nil, error: error == nil {⑦
coordinator = nil
发生错误情况下处理
let dict = NSMutableDictionary⑧
dict[NSLocalizedDescriptionKey] = "Failed to initialize the application''s saveddata"
dict[NSLocalizedFailureReasonErrorKey] = failureReason
dict[NSUnderlyingErrorKey] = error
error = NSErrordomain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict⑨
NSLog"Unresolved error \error, \error!.userInfo"
abort⑩
}
return coordinator
}
返回被管理对象模型
lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = NSBundle.mainBundle
.URLForResource"HelloWorld", withExtension: "momd"!
return NSManagedObjectModelcontentsOfURL: modelURL!
}
上面的3个属性是计算属性,它们的调用顺序如图34所示。
图34Core Data堆栈的调用顺序
第①行代码managedObjectContext属性返回MOC对象。第②行代码是调用persistentStoreCoordinator属性获得PSC对象,第③行代码用于实例化MOC对象,第④行代码通过managedObjectContext.persistentStoreCoordinator = coordinator语句设置PSC数据持久化类型。第⑤行代码中的persistentStoreCoordinator属性返回PSC对象。第⑥行代码用于实例化PSC对象,第⑦行代码使用addPersistentStoreWithType:configuration:URL:options:error:方法为PSC对象添加新的持久化数据存储。addPersistentStoreWithType参数用于指定存储类型,它的取值可以是下面的3个常量。□NSSQLiteStoreType。指数据持久化类型是SQLite数据。□NSBinaryStoreType。指数据持久化类型是二进制文件。□NSInMemoryStoreType。指数据持久化类型是内存形式。如果在代码第⑦行添加新的持久化数据存储失败,则通过代码⑧~⑩行输出错误日志,并终止任务,其中代码第⑧~⑨行是准备NSError对象,代码第⑩行abort函数是终止任务。3.3建模和生成实体在上一的代码中,有xcdatamodeld文件,它是模型文件模型文件一般是在数据库设计阶段用可视化建模工具创建的数据库模型描述文件。。Core Data可以利用它可视化设计数据库,生成实体类的ObjectiveC代码和SQLite数据库文件。下面介绍建模和生成实体这两个过程。3.3.1建模默认情况下,如果采用模板生成,会创建一个与工程名相同的数据模型文件工程名.xcdatamodeld,但是如果不采用模板,则创建过程是选择FileNewFile菜单项,从打开的选择文件模板对话框中选择iOSCore DataData Model,如图35所示。然后单击Next按钮,输入相应的文件名(这里输入CoreDataNotes),这样创建的数据模型文件就是CoreDataNotes.xcdatamodeld。但是需要注意的是,在程序代码中加载的时候,managedObjectModel属性中会用到这个文件:
lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = NSBundle.mainBundle.URLForResource"CoreDataNotes",
withExtension: "momd"!①
return NSManagedObjectModelcontentsOfURL: modelURL!
}
图35创建数据模型文件
注意注意上述代码第①行扩展名是momd而不是xcdatamodeld,这是因为CoreDataNotes.xcdatamodeld文件在编译发布时,变成了CoreDataNotes.momd。
由于数据模型文件CoreDataNotes.xcdatamodeld属于资源文件,如果采用基于一个工作空间不同工程的分层架构,CoreDataNotes.xcdatamodeld文件应该创建并放置在表示层的工程中。打开CoreDataNotes.xcdatamodeld文件,看到如图36所示的模型对话框,在这个对话框中可以创建实体entity、实体属性和实体关系等。
图36模型对话框
创建实体的过程如图37所示,单击Add Entity按钮添加实体,将其名称修改为Note,在右边的Attributes列表框中添加属性date和content,并选择Type为Date和String。
图37创建实体
选择右下角的Editor Style按钮,改变后的建模样式对话框如图38所示。
图38建模样式对话框
3.3.2生成实体选择实体Note,打开其数据模型检查器,如图39所示,在Entity的Class输入框中输入NoteManagedObject。
图39输入实体类名
然后再选择FileNewFile菜单项,从打开的选择文件模板对话框中选择iOSCore Data NSManagedObject subclass,如图310所示。接着单击Next按钮,进入如图311所示界面,选择CoreDataNotes数据模型文件。单击Next按钮,进入如图312所示的界面,选择Note实体。
图310生成实体类
图311选择要管理的数据模型
图312选择要管理的实体
生成之后的实体类的NoteManagedObject.swift代码如下:
import Foundation
import CoreData
class NoteManagedObject: NSManagedObject {
@NSManaged var date: NSDate
@NSManaged var content: String
}
但是为了防止出现如下类加载错误:
Unable to load class named ''NoteManagedObject'' for entity ''Note''. Class not found, using default NSManagedObject instead.
修改NoteManagedObject.swift代码如下:
import Foundation
import CoreData
@objcNoteManagedObject
class NoteManagedObject: NSManagedObject {
@NSManaged var date: NSDate
@NSManaged var content: String
}
NoteManagedObject实体类需要被Core Data管理,因此需要继承NSManagedObject类。而之前的实体类Note,它没有被Core Data管理,Note.swift代码如下:
class Note {
var date:NSDate
var content:NSString
initdate:NSDate, content:NSString {
self.date = date
self.content = content
}
}
3.4实例: 采用Core Data实现MyNotes应用先介绍一下MyNotes应用,这个应用是一个基于iOSiPhone和iPad两个平台的MyNotes应用,它具有增加、删除和查询备忘录的基本功能。图313是MyNotes应用的用例图。分层设计之后,表示层可以有iPhone版和iPad版本,而业务逻辑层、数据持久层和信息系统层可以公用,这样大大减少了工作量。
图313MyNotes应用的用例图
考虑到iOS有iPhone和iPad两个平台,针对不同的平台绘制了相应的设计原型草图,如图314~图316所示。
图314iPhone版本的MyNotes设计原型草图
图315iPad版本的MyNotes横屏设计原型草图
图316iPad版本的MyNotes竖屏设计原型草图
3.4.1采用Core Data分层架构设计MyNotes采用分层架构设计,有关于分层架构设计读者可以参考笔者编著的《iOS实战: 入门与提高卷Swift版》或《iOS开发指南》的相关章节,本书不再赘述。通过Xcode工程模板添加的Core Data堆栈都是在应用程序委托对象AppDelegate中的。按照分层架构设计规范,应用程序委托对象属于表示层,而Core Data堆栈属于数据持久层,Core Data中的对象NSManagedObjectContext、NSPersistentStoreCoordinator、NSManagedObjectModel和NSManagedObject等都不能出现在其他层中。所以将Core Data堆栈的代码移植到DAO类CoreDataDAO中,其中CoreDataDAO是所有DAO类的父类。CoreDataDAO.swift的代码如下:
import Foundation
import CoreData
class CoreDataDAO: NSObject {
返回应用程序Docment目录的NSURL类型
lazy var applicationDocumentsDirectory: NSURL = {
let urls = NSFileManager.defaultManager
.URLsForDirectory.DocumentDirectory, inDomains: .UserDomainMask
return urls[urls.count-1] as! NSURL
}
MARK: - Core Data 堆栈
返回被管理的对象上下文
lazy var managedObjectContext: NSManagedObjectContext? = {
let coordinator = self.persistentStoreCoordinator
if coordinator == nil {
return nil
}
var managedObjectContext = NSManagedObjectContext
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}
返回持久化存储协调者
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {
var coordinator: NSPersistentStoreCoordinator? =
NSPersistentStoreCoordinatormanagedObjectModel: self.managedObjectModel
let url = self.applicationDocumentsDirectory
.URLByAppendingPathComponent"CoreDataNotes.sqlite"
var error: NSError? = nil
var failureReason = "There was an error creating or loading the application''s saved data."
if coordinator!.addPersistentStoreWithTypeNSSQLiteStoreType,
configuration: nil, URL: url, options: nil, error: error == nil {
coordinator = nil
let dict = [String: AnyObject]
dict[NSLocalizedDescriptionKey] = "Failed to initialize the application''s saved data"
dict[NSLocalizedFailureReasonErrorKey] = failureReason
dict[NSUnderlyingErrorKey] = error
error = NSErrordomain: "51work6.com", code: 9999, userInfo: dict
NSLog"Unresolved error \error, \error!.userInfo"
abort
}
return coordinator
}
返回被管理的对象模型
lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = NSBundle.mainBundle.
URLForResource"CoreDataNotes", withExtension: "momd"!
return NSManagedObjectModelcontentsOfURL: modelURL!
}
}
然后让NoteDAO继承CoreDataDAO,并且增加了NoteManagedObject被管理实体类,这样数据持久层工程中的类如表31所述。
表31数据持久层工程中的类
类名说明CoreDataDAODAO基类NoteDAONoteDAO类Note未被管理的实体类NoteManagedObject被管理的实体类
Note和NoteManagedObject看起来有点重复,但是它们有不同的角色,这是一个非常重要的问题。如果不采用分层设计,完全可以采用NoteManagedObject没有问题。但是由于这里采用了分层设计,NoteManagedObject对象必须被严格限定在持久层中使用,而在表示层和业务逻辑层中实体需要使用Note对象,因为这两层不存在Core Data堆栈不能使用NoteManagedObject对象。如果数据从持久层返回给业务逻辑层时,需要NoteManagedObject对象转换为Note对象; 如果数据从业务逻辑层传递给持久层时,需要Note对象转换为NoteManagedObject对象。这个工作看起来比较麻烦,但是随着业务复杂度的增加,它的优点便会呈现出来。3.4.2查询数据下面具体看看在分层架构下如何采用Core Data技术实现查询和修改insert、update和delete数据。先看看查询,查询分为无条件查询和有条件查询。1. 无条件查询NoteDAO.swift中查询所有数据方法的代码如下:
func findAll - NSMutableArray {
var cxt = self.managedObjectContext!
let entity = NSEntityDescription.entityForName"Note", inManagedObjectContext: cxt ①
let fetchRequest = NSFetchRequest②
fetchRequest.entity = entity③
var sortDescriptor = NSSortDescriptorkey:"date", ascending:true④
var sortDescriptors: NSArray = NSArrayobjects: sortDescriptor
fetchRequest.sortDescriptors = sortDescriptors⑤
var error: NSError? = nil
var listData = cxt.executeFetchRequestfetchRequest, error: error as NSArray!⑥
var resListData = NSMutableArray
for item in listData {⑦
var mo = item as! NSManagedObject⑧
var date = mo.valueForKey"date" as! NSDate!⑨
var content = mo.valueForKey"content" as! NSString!
var note = Notedate: date, content: content
resListData.addObjectnote⑩
}
return resListData
}
第①行代码中的NSEntityDescription是实体关联的描述类,通过指定实体的名字获得NSEntityDescription实例对象,实体的名字是在数据模型文件中定义的。第②行代码中的NSFetchRequest是数据提取请求类,用于查询。第③行代码把实体描述设定到请求对象中。第④行代码中的NSSortDescriptor是排序描述类,它可以指定排序字段以及排序方式。第⑤行代码把排序描述设定到请求对象中。第⑥行中的cxt.executeFetchRequestfetchRequest, error: error as NSArray!语句根据前面设置的请求对象执行查询,返回NSArray集合。但是NSArray集合中放置的是被管理的NoteManagedObject实体对象,需要把它们转换到Note实体对象中,并把它们放置在NSMutableArray集合中。第⑦行循环体就实现了这个转换。第⑧行代码var mo = item as! NSManagedObject是从里元素转换为NSManagedObject类型。第⑨行代码是从NSManagedObject对象中按照date键取出数据。第⑩行代码是将NSManagedObject对象添加到集合变量resListData中。
2. 有条件查询NoteDAO.swift中按照主键查询数据的代码如下:
func findByIdmodel: Note - Note? {
var cxt = self.managedObjectContext!
let entity = NSEntityDescription.entityForName"Note", inManagedObjectContext: cxt
let fetchRequest = NSFetchRequest
fetchRequest.entity = entity
fetchRequest.predicate = NSPredicateformat: "date = %@", model.date①
var sortDescriptor = NSSortDescriptorkey:"date", ascending:true
var sortDescriptors: NSArray = NSArrayobjects: sortDescriptor
fetchRequest.sortDescriptors = sortDescriptors
var error: NSError? = nil
var listData = cxt.executeFetchRequestfetchRequest, error: error as NSArray!
if listData.count 0 {
var mo = listData.lastObject as! NSManagedObject
var date = mo.valueForKey"date" as! NSDate!
var content = mo.valueForKey"content" as! NSString!
var note = Notedate: date, content: content
return note
}
return nil
}
与无条件查询不同的是,增加了第①行代码,NSPredicate用来定义一个逻辑查询条件。创建NSPredicate对象可以通过如下构造器实现,构造器的Swift语言中表示为:
initformat format: String, arguments argList: CVaListPointer
其中,argList参数"SELF.image contains[c] %@"是Predicate字符串,它有点像SQL语句或是HQLHibernate Query Language,其中SELF代表要查询的对象,SELF.image是查询对象的image字段字典对象的键或实体对象的属性。contains[c]是包含字符的意思,其中小写c表示不区分大小写的。
提示关于Predicate字符串的语法,可以参考https:developer.apple.comlibrarymacdocumentationCocoaConceptualPredicatesArticlespSyntax.html。
下面还有两个NSPredicate的例子:
var array = NSMutableArrayarray : ["Bill", "Ben", "Chris", "Melissa"]
let bPredicate = NSPredicateformat: "SELF beginswith[c] ''@%''", "b"
let beginWithB = array.filteredArrayUsingPredicatebPredicate!
beginWithB 包含 { @"Bill", @"Ben" }.
let sPredicate = NSPredicateformat: "SELF contains[c] ''@%''", "s"
array.filteredArrayUsingPredicatesPredicate!
数组包含 { @"Chris", @"Melissa" }
3.4.3修改数据这里的修改数据也是指insert、update和delete。在NoteDAO.swift中插入备忘录的方法如下:
func createmodel: Note - Int {
var cxt = self.managedObjectContext!
let note = NSEntityDescription.insertNewObjectForEntityForName"Note",
inManagedObjectContext:cxt as! NSManagedObject①
note.setValuemodel.date, forKey: "date"②
note.setValuemodel.content, forKey: "content"③
var error: NSError? = nil
if !cxt.saveerror {④
NSLog"插入数据失败, \error, \error!.userInfo"
abort
}
NSLog"插入数据成功"
return 0
}
第①行代码用于创建一个被管理的Note实体对象,也可以使用NoteManagedObject类型替换为NSManagedObject类型。第②行代码用于设定content属性值,如何note的类型是NoteManagedObject,可以使用写成note.content = model.content替代note.setValuemodel.date, forKey: "date",这是一种通过属性赋值的方法。第③行代码用于设定date属性值。第④行中的cxt.saveerror语句保存修改,同步到持久化数据文件中。NoteDAO.swift中删除备忘录的方法如下:
func removemodel: Note - Int {
var cxt = self.managedObjectContext!
let entity = NSEntityDescription.entityForName"Note", inManagedObjectContext: cxt
let fetchRequest = NSFetchRequest
fetchRequest.entity = entity
fetchRequest.predicate = NSPredicateformat: "date = %@", model.date
var error: NSError? = nil
var listData = cxt.executeFetchRequestfetchRequest, error: error as NSArray!
if listData.count 0 {
var note = listData.lastObject as! NSManagedObject
cxt.deleteObjectnote①
if !cxt.saveerror {②
NSLog"删除数据失败, \error, \error!.userInfo"
abort
}
NSLog"删除数据成功"
}
return 0
}
进行删除操作时,首先要查询出要删除的实体,然后使用第①行语句删除实体,最后在第②行调用cxt.saveerror语句保存修改,同步到持久化数据文件中。NoteDAO.swift中修改备忘录的方法如下:
func modifymodel: Note - Int {
var cxt = self.managedObjectContext!
let entity = NSEntityDescription.entityForName"Note", inManagedObjectContext: cxt
let fetchRequest = NSFetchRequest
fetchRequest.entity = entity
fetchRequest.predicate = NSPredicateformat: "date = %@", model.date
var error: NSError? = nil
var listData = cxt.executeFetchRequestfetchRequest, error: error as NSArray!
if listData.count 0 {
var note = listData.lastObject as! NSManagedObject
note.setValuemodel.content, forKey: "content"
if !cxt.saveerror {①
NSLog"修改数据失败, \error, \error!.userInfo"
abort
}
NSLog"修改数据成功"
}
return 0
}
要进行修改操作,首先需要查询出要修改的实体,然后修改实体中的属性,最后在第①行调用cxt.saveerror语句保存修改,同步到持久化数据文件中。本章小结通过本章的学习,使读者了解苹果的Core Data数据持久化技术,以及如何在分层架构设计中采用Core Data技术。
|
|