CloudKit — Database 类型

CloudKit 中,数据库分为三种类型:Private Database(私有数据库)、Public Database(公共数据库)和 Shared Database(共享数据库)。它们在数据的访问权限、可见性、存储配额、使用场景等方面有很大的区别。以下是详细的解释和对比:


1. Private Database(私有数据库) #

定义 #

  • 私有数据库为每个用户提供了一个独立的数据存储空间,只有该用户可以访问这些数据,其他用户无法访问。
  • 数据存在于当前用户的 iCloud 容器中,与用户的 Apple ID 关联。

特点 #

  1. 访问权限:

    • 每个用户只能看到和访问自己的私有数据库数据。
    • 数据由用户的 Apple ID 区分,每个用户的数据都互相隔离。
  2. 数据配额:

    • 数据存储占用的是用户的 iCloud 存储空间。用户的 iCloud 空间不足时,将无法存储更多数据。
  3. 使用场景:

    • 需要隐私个人化存储的场景。
    • 例如:健身应用存储每个用户的锻炼记录、待办事项应用存储用户的待办任务、笔记应用存储个人笔记等。
  4. 同步机制:

    • 数据会在多设备间自动同步,例如 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(公共数据库) #

定义 #

  • 公共数据库为所有用户提供了共享的数据存储空间,所有用户都可以访问公共数据库数据。
  • 数据的读取在默认情况下是公开的,但写入权限可以由开发者决定。

特点 #

  1. 访问权限:

    • 所有用户都可以读取公共数据库的数据(如果没有额外限制)。
    • 数据写入权限可以在 CloudKit 控制台中进行配置,例如:
      • 所有人可以写入。
      • 仅特定用户组或管理员拥有写入权限。
  2. 数据配额:

    • 数据存储占用的是 开发者的 CloudKit 容器存储配额,而不是用户的 iCloud 存储空间。
    • 适用于需要共享的公共数据存储(例如公共的新闻、内容信息)。
  3. 使用场景:

    • 需要全局共享的数据存储。
    • 例如:共享新闻内容、游戏排行榜、公告信息和公共内容数据等。
  4. 管理机制:

    • 在 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(共享数据库) #

定义 #

  • 共享数据库允许用户将自己的数据共享给其他用户
  • 数据的所有权仍然归属于原始创建者,但被共享的用户可以根据开发者设定的权限,查看或修改这些数据。

特点 #

  1. 访问权限:

    • 数据的所有者可以选择与哪些用户共享数据。
    • 被共享的用户可以根据权限访问数据,查看或修改。
    • 数据的所有权依然属于原来的用户,被共享的用户不能删除数据,只能访问数据。
  2. 数据配额:

    • 数据存储占用数据创建者的 iCloud 存储空间
    • 被共享用户不需要消耗他们的 iCloud 存储空间。
  3. 使用场景:

    • 应用于需要协作的场景。
    • 例如:
      • 笔记应用中的共享协作笔记。
      • 任务管理应用中多用户共享任务列表。
      • 文件共享应用中与其他用户共享文档。
  4. 共享机制(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 DatabasePublic DatabaseShared Database
访问权限仅当前用户可访问所有用户可读,写入权限可配置数据拥有者及被邀请用户可访问
存储配额占用用户 iCloud 存储空间占用开发者的 CloudKit 容器存储占用拥有者的 iCloud 存储空间
共享数据不支持面向所有用户,不需要特别的共享流程支持细粒度的个人数据共享
场景适用个人隐私数据,例如用户笔记、设置等公共数据,例如新闻、公告等协作数据,例如共享任务、文档协作等

5. 总结与选择 #

  • 使用 Private Database

    • 当你需要为用户存储隐私数据或每个用户的个性化配置时,比如用户的健身记录、个人笔记。
  • 使用 Public Database

    • 如果数据是为所有用户共享的,比如新闻、活动、排名榜、公告等全局数据。
  • 使用 Shared Database

    • 当需要实现多人协作、共享功能(例如共享笔记、共享任务)时,这是一种非常强大的选择。

参考文档 #

CloudKit 的 Public DatabasePrivate DatabaseShared Database 是官方文档中 CloudKit 数据管理、架构设计的重要部分。你可以在 Apple 官方文档的以下章节中查看【CloudKit 数据库设计相关内容】:


参考文档与节标题 #

  1. CloudKit Overview
  • 官方文档描述: CloudKit 的入门说明,介绍了 CloudKit 基本概念和体系,包括 Public Database、Private Database 和 Shared Database 的作用。

  • 推荐阅读的子章节:

  • “How CloudKit Organizes Data”
    具体描述了 Container、Database 和 Record 的层级结构。

  • 核心概念:数据库类型

  • Public Database

  • Private Database

  • Shared Database

  1. CloudKit Database Types
  • 官方文档描述: 详细说明了 CloudKit 提供的三种数据库类型(public、private 和 shared),以及如何选择合适的数据库类型来满足应用需求。

  • 推荐阅读的子节:

  • Overview of Database Types” :关于数据库以及使用场景的描述。

  • Choosing the Right Database”:为不同的数据场景推荐合适的数据库类型。

  • Using Shared Databases for Collaboration”:详细演示了如何实现共享记录的功能。

  1. Sharing CloudKit Data
  • 官方文档描述: 专注于 CloudKit 中的共享数据库(Shared Database)。讨论了如何使用 CKShareCKSharedDatabase 在用户之间共享数据。

  • 推荐阅读的子节:

  • Creating a Share”:向用户发送共享数据。

  • Accepting a Share”:用户接收共享并在 Shared Database 中访问记录。

  • 示例代码:如何使用 Shared Database 进行协作。

  1. CKDatabase Class Reference
  • 官方文档描述: 紧扣具体 API,包括 CKDatabase 类的操作,例如查询、保存、和删除记录。每个数据库方法中有对 Public、Private 和 Shared Database 的详细调用示例。

  • 核心方法:

  • fetchAllRecordZones(withCompletionHandler:)

  • save(_:completionHandler:)

  • add(_:completionHandler:)

  1. CloudKit Sharing Guide
  • 官方文档描述: 此文档是关于在多用户之间实现协作的完整指南,并介绍了 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 DatabasePrivate DatabaseShared Database 的内容,建议:

  1. 阅读以下两篇主要章节:
  1. 使用官方提供的示例代码运行并调试数据库操作的方法。
  2. 观看 WWDC 视频,理解具体应用场景和最佳实践。
本文共 2751 字,上次修改于 Jan 4, 2025