描述
开 本: 16开纸 张: 胶版纸包 装: 平装是否套装: 否国际标准书号ISBN: 9787302417743丛书名: 清华开发者书库
本书是关东升老师针对iOS入门读者精心编写的“iOS实战”四大宝典之一,通过这四本书,真正实现零基础到APP上架,步入移动开发殿堂。
《iOS实战:入门与提高卷(Swift版)》
《iOS实战:图形图像、动画和多媒体卷(Swift版)》
《iOS实战:传感器卷(Swift版)》
《iOS实战:苹果“生态圈”编程卷(Swift版)》
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章 地图应用开发
图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.save(&error) {
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?
= NSPersistentStoreCoordinator(managedObjectModel: 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!.addPersistentStoreWithType(NSSQLiteStoreType,
configuration: nil, URL: url, options: nil, error: &error) == nil {⑦
coordinator = nil
// 发生错误情况下处理
let dict = NSMutableDictionary()⑧
dict[NSLocalizedDescriptionKey] = “Failed to initialize the application’s saved data”
dict[NSLocalizedFailureReasonErrorKey] = failureReason
dict[NSUnderlyingErrorKey] = error
error = NSError(domain: “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 NSManagedObjectModel(contentsOfURL: 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建模和生成实体在上一的代码中,有,它是模型文件模型文件一般是在数据库设计阶段用可视化建模工具创建的数据库模型描述文件。。Core Data可以利用它可视化设计数据库,生成实体类的ObjectiveC代码和SQLite数据库文件。下面介绍建模和生成实体这两个过程。3.3.1建模默认情况下,如果采用模板生成,会创建一个与工程名相同的数据模型文件——.xcdatamodeld,但是如果不采用模板,则创建过程是选择File→New→File菜单项,从打开的选择文件模板对话框中选择iOS→Core Data→Data Model,如图35所示。然后单击Next按钮,输入相应的文件名(这里输入CoreDataNotes),这样创建的数据模型文件就是CoreDataNotes.xcdatamodeld。但是需要注意的是,在程序代码中加载的时候,managedObjectModel属性中会用到这个文件:
lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = NSBundle.mainBundle().URLForResource(“CoreDataNotes”,
withExtension: “momd”)!①
return NSManagedObjectModel(contentsOfURL: 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输入实体类名
然后再选择File→New→File菜单项,从打开的选择文件模板对话框中选择iOS→Core 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
@objc(NoteManagedObject)
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
init(date:NSDate, content:NSString ) {
self.date = date
self.content = content
}
}
3.4实例: 采用Core Data实现MyNotes应用先介绍一下MyNotes应用,这个应用是一个基于iOS(iPhone和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? =
NSPersistentStoreCoordinator(managedObjectModel: 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!.addPersistentStoreWithType(NSSQLiteStoreType,
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 = NSError(domain: “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 NSManagedObjectModel(contentsOfURL: 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 = NSSortDescriptor(key:”date”, ascending:true) ④
var sortDescriptors: NSArray = NSArray(objects: sortDescriptor)
fetchRequest.sortDescriptors = sortDescriptors ⑤
var error: NSError? = nil
var listData = cxt.executeFetchRequest(fetchRequest, 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 = Note(date: date, content: content)
resListData.addObject(note)⑩
}
return resListData
}
第①行代码中的NSEntityDescription是实体关联的描述类,通过指定实体的名字获得NSEntityDescription实例对象,实体的名字是在数据模型文件中定义的。第②行代码中的NSFetchRequest是数据提取请求类,用于查询。第③行代码把实体描述设定到请求对象中。第④行代码中的NSSortDescriptor是排序描述类,它可以指定排序字段以及排序方式。第⑤行代码把排序描述设定到请求对象中。第⑥行中的cxt.executeFetchRequest(fetchRequest, error: &error) as NSArray!语句根据前面设置的请求对象执行查询,返回NSArray集合。但是NSArray集合中放置的是被管理的NoteManagedObject实体对象,需要把它们转换到Note实体对象中,并把它们放置在NSMutableArray集合中。第⑦行循环体就实现了这个转换。第⑧行代码var mo = item as! NSManagedObject是从里元素转换为NSManagedObject类型。第⑨行代码是从NSManagedObject对象中按照date键取出数据。第⑩行代码是将NSManagedObject对象添加到集合变量resListData中。
2. 有条件查询NoteDAO.swift中按照主键查询数据的代码如下:
func findById(model: Note) – Note? {
var cxt = self.managedObjectContext!
let entity = NSEntityDescription.entityForName(“Note”, inManagedObjectContext: cxt)
let fetchRequest = NSFetchRequest()
fetchRequest.entity = entity
fetchRequest.predicate = NSPredicate(format: “date = %@”, model.date)①
var sortDescriptor = NSSortDescriptor(key:”date”, ascending:true)
var sortDescriptors: NSArray = NSArray(objects: sortDescriptor)
fetchRequest.sortDescriptors = sortDescriptors
var error: NSError? = nil
var listData = cxt.executeFetchRequest(fetchRequest, 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 = Note(date: date, content: content)
return note
}
return nil
}
与无条件查询不同的是,增加了第①行代码,NSPredicate用来定义一个逻辑查询条件。创建NSPredicate对象可以通过如下构造器实现,构造器的Swift语言中表示为:
init(format format: String, arguments argList: CVaListPointer)
其中,argList参数”SELF.image contains[c] %@”是Predicate字符串,它有点像SQL语句或是HQL(Hibernate Query Language),其中SELF代表要查询的对象,SELF.image是查询对象的image字段(字典对象的键或实体对象的属性)。contains[c]是包含字符的意思,其中小写c表示不区分大小写的。
提示关于Predicate字符串的语法,可以参考https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html。
下面还有两个NSPredicate的例子:
var array = NSMutableArray(array : [”Bill”, “Ben”, “Chris”, “Melissa”])
let bPredicate = NSPredicate(format: “SELF beginswith[c] ‘@%'”, “b”)
let beginWithB = array.filteredArrayUsingPredicate(bPredicate!)
//beginWithB 包含 { @”Bill”, @”Ben” }.
let sPredicate = NSPredicate(format: “SELF contains[c] ‘@%'”, “s”)
array.filteredArrayUsingPredicate(sPredicate!)
//数组包含 { @”Chris”, @”Melissa” }
3.4.3修改数据这里的修改数据也是指insert、update和delete。在NoteDAO.swift中插入备忘录的方法如下:
func create(model: Note) – Int {
var cxt = self.managedObjectContext!
let note = NSEntityDescription.insertNewObjectForEntityForName(“Note”,
inManagedObjectContext:cxt) as! NSManagedObject ①
note.setValue(model.date, forKey: “date”) ②
note.setValue(model.content, forKey: “content”)③
var error: NSError? = nil
if !cxt.save(&error) { ④
NSLog(“插入数据失败, \(error), \(error!.userInfo)”)
abort()
}
NSLog(“插入数据成功”)
return 0
}
第①行代码用于创建一个被管理的Note实体对象,也可以使用NoteManagedObject类型替换为NSManagedObject类型。第②行代码用于设定content属性值,如何note的类型是NoteManagedObject,可以使用写成note.content = model.content替代note.setValue(model.date, forKey: “date”),这是一种通过属性赋值的方法。第③行代码用于设定date属性值。第④行中的cxt.save(&error)语句保存修改,同步到持久化数据文件中。NoteDAO.swift中删除备忘录的方法如下:
func remove(model: Note) – Int {
var cxt = self.managedObjectContext!
let entity = NSEntityDescription.entityForName(“Note”, inManagedObjectContext: cxt)
let fetchRequest = NSFetchRequest()
fetchRequest.entity = entity
fetchRequest.predicate = NSPredicate(format: “date = %@”, model.date)
var error: NSError? = nil
var listData = cxt.executeFetchRequest(fetchRequest, error: &error) as NSArray!
if (listData.count 0) {
var note = listData.lastObject as! NSManagedObject
cxt.deleteObject(note)①
if !cxt.save(&error) {②
NSLog(“删除数据失败, \(error), \(error!.userInfo)”)
abort()
}
NSLog(“删除数据成功”)
}
return 0
}
进行删除操作时,首先要查询出要删除的实体,然后使用第①行语句删除实体,后在第②行调用cxt.save(&error)语句保存修改,同步到持久化数据文件中。NoteDAO.swift中修改备忘录的方法如下:
func modify(model: Note) – Int {
var cxt = self.managedObjectContext!
let entity = NSEntityDescription.entityForName(“Note”, inManagedObjectContext: cxt)
let fetchRequest = NSFetchRequest()
fetchRequest.entity = entity
fetchRequest.predicate = NSPredicate(format: “date = %@”, model.date)
var error: NSError? = nil
var listData = cxt.executeFetchRequest(fetchRequest, error: &error) as NSArray!
if (listData.count 0) {
var note = listData.lastObject as! NSManagedObject
note.setValue(model.content, forKey: “content”)
if !cxt.save(&error) {①
NSLog(“修改数据失败, \(error), \(error!.userInfo)”)
abort()
}
NSLog(“修改数据成功”)
}
return 0
}
要进行修改操作,首先需要查询出要修改的实体,然后修改实体中的属性,后在第①行调用cxt.save(&error)语句保存修改,同步到持久化数据文件中。本章小结通过本章的学习,使读者了解苹果的Core Data数据持久化技术,以及如何在分层架构设计中采用Core Data技术。
评论
还没有评论。