Core Data 是一个强大的框架,用于管理 iOS 和 macOS 应用程序的数据模型。它可以帮助开发者快速地创建和维护数据库,并且可以轻松地将数据存储在本地文件中。Core Data 提供了一个面向对象的方法来管理数据,使得开发者可以快速而有效地处理大量的数据。
Core Data 的核心是一个关系型数据库,它使用 SQLite 作为存储引擎。它允许开发者将多个表格连接起来,并使用 SQL 语句来执行复杂的数据库查询。此外,Core Data 还包含一些高级功能,如对象图形映射 (Object Graph Mapping)、内存管理 (Memory Management) 和性能优化 (Performance Optimization) 等。
// 创建 Core Data Stack let persistentContainer = NSPersistentContainer(name: "MyDataModel") persistentContainer.loadPersistentStores { (description, error) in if let error = error { fatalError("Unresolved error \(error)") } } // 获取上下文对象 let context = persistentContainer.viewContext // 创建新的实体对象 let newEntity = NSEntityDescription.insertNewObject(forEntityName: "MyEntity", into: context) as! MyEntity // MyEntity 是你创建的实体名称 // 这里你可以保存新创建的实体对象 try context.save() // 查询所有实体对象 let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "MyEntity") do { let results = try context.fetch(fetchRequest) for result in results as! [NSManagedObject] { print("result: \(result)") } } catch { print("Error fetching data") }
原文出处: http://chengway.in/post/ji-zhu/core-data-by-tutorials-bi-ji-wu
我们继续来看《Core Data by Tutorials》这本书的第七章 Syncing with iCloud,本章所讨论的是iOS 8和Yosemite最新释出的iCloud Drive,至于iCloud Drive与iCloud的区别可以看这里,调试本章code需要一个开发者帐号:)
iCloud是基于Core Data的,之前几个版本确实做的比较烂,不过苹果也在不断地改进。本章的代码其实就是在第六章代码的基础上改为Cloud版本。
iCloud对core data store同步其实使用的是ubiquity containers(无处不在的容器),这个无处不在的容器存在你应用的sandbox中,并由iOS系统替你管理。如同向NSFileManager请求应用的 Documents directory,对于iCloud来说,请求的是一个ubiquity container URL。
Core Data通过这个ubiquity container URL保存应用程序的数据,他和通过URL保存到Documents没什么区别。唯一不同的就是iCloud后台进程监视着ubiquity container里面文件的变化,时刻准备上传到云端,而这一切都是系统自动完成的。
这里需要注意的是,iCloud的运行机制有点类似与Git,每次同步的其实是transaction logs,而不是data store本身。而与Git不同的是,commit的时候,Git经常需要处理冲突。但iCloud的commit change是“atomic”的,意味着,要么数据全部有效,要么全部丢弃。
作者这里用伦敦桥搬家举了一个很形象的例子,把桥拆成一砖一砖,然后搬到目的地再按照log记录的正确顺序重组。iCloud的工作机制也差不多。
在Xcode中将Capabilities中的iCloud启用。这里可以使用默认的ubiquity container,也可以自定义。
为.addPersistentStoreWithType方法的参数**option数组增加一个成员NSPersistentStoreUbiquitousContentNameKey**,同样地在stack的初始化中设置。
lazy var stack : CoreDataStack = {
let options = [NSPersistentStoreUbiquitousContentNameKey: "CloudNotes",
NSMigratePersistentStoresAutomaticallyOption: true,
NSInferMappingModelAutomaticallyOption: true]
let stack = CoreDataStack(modelName: "CloudNotesDataModel",
storeName: "CloudNotes",
options: options)
return stack
}()
使用NSPersistentStoreUbiquitousContentNameKey的值CloudNotes,在ubiquity container中来唯一标识该应用的persistent store。
到此为止,已经为该APP完全开启了iCloud同步,很简单吧。但Core Data在背后还是做了一些工作的,其中一项就是设置了一个fallback store,用于在iCloud离线时保存数据。不过开发者完全不用担心这些东西。
至于测试则需要拥有一个开发者帐号,登录itunesconnect,依次选择Users and Roles >> Sandbox Testers 新建一个测试用户,这里注意的是,新建完的测试帐号需要在真机设备上激活一下。
具体的测试也很简单,现在模拟器上运行起来,可以看到目前所有添加的数据,然后切换target device(并不按下停止键)选择真机设备Run一下,此时模拟器和真机会同时运行。此时在模拟器上创建新的记录,并选择DebugTrigger iCloud Sync来触发同步,不久应该就能看到新添加的记录在真机上出现。作者还展示了iCloud gauge的方式来查看具体的同步记录。
现在可以来总结一下设置iCloud的基本步骤了,主要有三步:
前两步已经说过了,现在来看第3点。
该实例程序使用的是fetched results controller,而fetched results controller主要又依赖的是NSManagedObjectContext。但是iCloud更新是直接在persistent store级别的,不会经过Context。因此也不会触发fetched results controller的代理方法来更新UI。
既然如此,我们需要知道iCloud何时更新可以通过监听广播的方法来实现,通过监听NSPersistentStoreDidImportUbiquitousContentChangesNotification广播,来刷新context(通过mergeChangesFromContextDidSaveNotification(notification))
当前账户登出的话,Core Data会删除当前数据(都安全保存在云端,会在用户重新登录时同步回来)。帐号切换时,Core Data会发送如下两个通知:
the notification会包含具体要被adding/added或removing/removed的NSPersistentStore objects
先处理 “will change” notification:
func persistentStoreCoordinatorWillChangeStores( notification: NSNotification){
var error : NSErrorPointer = nil if context.hasChanges {
if context.save(error) == false {
print("Error saving (error)")
}
}
context.reset()
}
再处理“did change” notification
func persistentStoreCoordinatorDidChangeStores(notification:NSNotification){
notes.performFetch(nil)
tableView.reload()
}
作者:Tarek Ziadé,翻译:张吉原文:http://www.aosabook.org/en/packaging.html14.1 简介对于如何安装软件,目前有两种思想流...