在 CloudKit 中,数据库分为三种类型:Private Database(私有数据库)、Public Database(公共数据库)和 Shared Database(共享数据库)。它们在数据的访问权限、可见性、存储配额、使用场景等方面有很大的区别。以下是详细的解释和对比:
1. Private Database(私有数据库) #
定义 #
- 私有数据库为每个用户提供了一个独立的数据存储空间,只有该用户可以访问这些数据,其他用户无法访问。
- 数据存在于当前用户的 iCloud 容器中,与用户的 Apple ID 关联。
特点 #
访问权限:
- 每个用户只能看到和访问自己的私有数据库数据。
- 数据由用户的 Apple ID 区分,每个用户的数据都互相隔离。
数据配额:
- 数据存储占用的是用户的 iCloud 存储空间。用户的 iCloud 空间不足时,将无法存储更多数据。
使用场景:
- 需要隐私或个人化存储的场景。
- 例如:健身应用存储每个用户的锻炼记录、待办事项应用存储用户的待办任务、笔记应用存储个人笔记等。
同步机制:
- 数据会在多设备间自动同步,例如 iPhone、iPad 和 Mac 上使用同一个 Apple ID 登录时。
- 只有用户自己的设备能够访问这些数据。
代码示例 #
let container = CKContainer.default()
let privateDatabase = container.privateCloudDatabase
// 保存数据到私有数据库
let record = CKRecord(recordType: "WorkoutData")
record["caloriesBurned"] = 500
privateDatabase.save(record) { savedRecord, error in
if let error = error {
print("Error saving record to private database: \(error)")
} else {
print("Record saved to private database: \(savedRecord)")
}
}
2. Public Database(公共数据库) #
定义 #
- 公共数据库为所有用户提供了共享的数据存储空间,所有用户都可以访问公共数据库数据。
- 数据的读取在默认情况下是公开的,但写入权限可以由开发者决定。
特点 #
访问权限:
- 所有用户都可以读取公共数据库的数据(如果没有额外限制)。
- 数据写入权限可以在 CloudKit 控制台中进行配置,例如:
- 所有人可以写入。
- 仅特定用户组或管理员拥有写入权限。
数据配额:
- 数据存储占用的是 开发者的 CloudKit 容器存储配额,而不是用户的 iCloud 存储空间。
- 适用于需要共享的公共数据存储(例如公共的新闻、内容信息)。
使用场景:
- 需要全局共享的数据存储。
- 例如:共享新闻内容、游戏排行榜、公告信息和公共内容数据等。
管理机制:
- 在 CloudKit 控制台中,可以限制数据读取和写入的权限。
- 可以通过代码限制读取和写入条件。
代码示例 #
let container = CKContainer.default()
let publicDatabase = container.publicCloudDatabase
// 保存数据到公共数据库
let record = CKRecord(recordType: "PublicEvent")
record["title"] = "Party Invitation"
record["location"] = "City Park"
publicDatabase.save(record) { savedRecord, error in
if let error = error {
print("Error saving record to public database: \(error)")
} else {
print("Record saved to public database: \(savedRecord)")
}
}
// 查询公共数据库中的数据
let query = CKQuery(recordType: "PublicEvent", predicate: NSPredicate(value: true))
publicDatabase.perform(query, inZoneWith: nil) { records, error in
if let error = error {
print("Error querying public database: \(error)")
} else {
print("Fetched records: \(records)")
}
}
3. Shared Database(共享数据库) #
定义 #
- 共享数据库允许用户将自己的数据共享给其他用户。
- 数据的所有权仍然归属于原始创建者,但被共享的用户可以根据开发者设定的权限,查看或修改这些数据。
特点 #
访问权限:
- 数据的所有者可以选择与哪些用户共享数据。
- 被共享的用户可以根据权限访问数据,查看或修改。
- 数据的所有权依然属于原来的用户,被共享的用户不能删除数据,只能访问数据。
数据配额:
- 数据存储占用数据创建者的 iCloud 存储空间。
- 被共享用户不需要消耗他们的 iCloud 存储空间。
使用场景:
- 应用于需要协作的场景。
- 例如:
- 笔记应用中的共享协作笔记。
- 任务管理应用中多用户共享任务列表。
- 文件共享应用中与其他用户共享文档。
共享机制(Share):
- 通过
CKShare
类型创建共享数据。 - 在共享时,生成一个
CKShare
对象,并将数据绑定到一个 Zone 中。 - 邀请被共享的用户后,他们可以访问这些数据。
- 通过
代码示例 #
(1) 创建共享数据: #
let container = CKContainer.default()
let privateDatabase = container.privateCloudDatabase
// 创建共享记录
let record = CKRecord(recordType: "SharedDocument")
record["content"] = "This is a shared note"
// 创建 CKShare 对象
let share = CKShare(rootRecord: record)
share[CKShare.SystemFieldKey.title] = "Shared Note" as CKRecordValue
// 将记录保存到私有数据库,同时做共享配置
let modifyOperation = CKModifyRecordsOperation(recordsToSave: [record, share])
modifyOperation.modifyRecordsCompletionBlock = { savedRecords, deletedRecordIDs, error in
if let error = error {
print("Error saving shared record: \(error)")
} else {
print("Successfully saved shared record")
}
}
privateDatabase.add(modifyOperation)
(2) 查询共享数据: #
let container = CKContainer.default()
let sharedDatabase = container.sharedCloudDatabase
// 查询共享数据
let query = CKQuery(recordType: "SharedDocument", predicate: NSPredicate(value: true))
sharedDatabase.perform(query, inZoneWith: nil) { records, error in
if let error = error {
print("Error querying shared database: \(error)")
} else {
print("Fetched shared records: \(records)")
}
}
4. 对比总结 #
特性 | Private Database | Public Database | Shared Database |
---|---|---|---|
访问权限 | 仅当前用户可访问 | 所有用户可读,写入权限可配置 | 数据拥有者及被邀请用户可访问 |
存储配额 | 占用用户 iCloud 存储空间 | 占用开发者的 CloudKit 容器存储 | 占用拥有者的 iCloud 存储空间 |
共享数据 | 不支持 | 面向所有用户,不需要特别的共享流程 | 支持细粒度的个人数据共享 |
场景适用 | 个人隐私数据,例如用户笔记、设置等 | 公共数据,例如新闻、公告等 | 协作数据,例如共享任务、文档协作等 |
5. 总结与选择 #
使用 Private Database:
- 当你需要为用户存储隐私数据或每个用户的个性化配置时,比如用户的健身记录、个人笔记。
使用 Public Database:
- 如果数据是为所有用户共享的,比如新闻、活动、排名榜、公告等全局数据。
使用 Shared Database:
- 当需要实现多人协作、共享功能(例如共享笔记、共享任务)时,这是一种非常强大的选择。
参考文档 #
CloudKit 的 Public Database、Private Database 和 Shared Database 是官方文档中 CloudKit 数据管理、架构设计的重要部分。你可以在 Apple 官方文档的以下章节中查看【CloudKit 数据库设计相关内容】:
参考文档与节标题 #
官方文档描述: CloudKit 的入门说明,介绍了 CloudKit 基本概念和体系,包括 Public Database、Private Database 和 Shared Database 的作用。
推荐阅读的子章节:
“How CloudKit Organizes Data”
具体描述了 Container、Database 和 Record 的层级结构。核心概念:数据库类型
Public Database
Private Database
Shared Database
官方文档描述: 详细说明了 CloudKit 提供的三种数据库类型(public、private 和 shared),以及如何选择合适的数据库类型来满足应用需求。
推荐阅读的子节:
“Overview of Database Types” :关于数据库以及使用场景的描述。
“Choosing the Right Database”:为不同的数据场景推荐合适的数据库类型。
“Using Shared Databases for Collaboration”:详细演示了如何实现共享记录的功能。
官方文档描述: 专注于 CloudKit 中的共享数据库(Shared Database)。讨论了如何使用
CKShare
和CKSharedDatabase
在用户之间共享数据。推荐阅读的子节:
“Creating a Share”:向用户发送共享数据。
“Accepting a Share”:用户接收共享并在 Shared Database 中访问记录。
示例代码:如何使用 Shared Database 进行协作。
官方文档描述: 紧扣具体 API,包括
CKDatabase
类的操作,例如查询、保存、和删除记录。每个数据库方法中有对 Public、Private 和 Shared Database 的详细调用示例。核心方法:
fetchAllRecordZones(withCompletionHandler:)
save(_:completionHandler:)
add(_:completionHandler:)
官方文档描述: 此文档是关于在多用户之间实现协作的完整指南,并介绍了 Shared Database 的实际使用场景实现(包括权限设置、共享链接等)。
推荐模块:
Sharing Architecture
Adding Participants to Shared Data
Permissions for Shared Data
额外推荐资源 #
1. 视频教程 #
Apple 在 WWDC 会议中的相关视频也专门演示了 Public、Private 和 Shared Database 的实际使用场景及实现方法:
2. Sample Code(官方示例代码) #
Apple 提供了多个使用 CloudKit 开发数据库操作的完整代码示例,你可以直接下载运行学习:
如何快速找到重点 #
如果你重点想学习 Public Database、Private Database 和 Shared Database 的内容,建议:
- 阅读以下两篇主要章节:
- 使用官方提供的示例代码运行并调试数据库操作的方法。
- 观看 WWDC 视频,理解具体应用场景和最佳实践。