在 CloudKit 中,记录(Records)文件(Files/Assets) 是两种不同的数据存储方式,适用于不同类型的数据,它们的存储机制、使用场景和限制都有明显区别:

1. 记录(Records)

本质

记录是 CloudKit 中结构化数据的基本单位,类似关系型数据库中的"行",由记录类型(Record Type) 定义结构(类似"表"),包含多个字段(Fields)(类似"列")。

存储方式

  • 结构化存储:字段值类型受限,支持字符串、数字、日期、地理位置、引用(关联其他记录)等基础类型。
  • 直接存储在数据库中:记录本身(包括所有字段)直接保存在 CloudKit 数据库(公共/私有/共享数据库)中。
  • 大小限制:单条记录总大小不能超过 1MB,适合存储小型数据。

典型用途

  • 用户信息(用户名、偏好设置)
  • 文本内容(笔记、评论)
  • 结构化元数据(文章标题、发布时间、点赞数)
  • 关联关系(如"文章-作者"的引用关系)

操作示例

// 创建一条"Article"类型的记录
let articleRecord = CKRecord(recordType: "Article")
articleRecord["title"] = "CloudKit 教程" as CKRecord.Value
articleRecord["author"] = "张三" as CKRecord.Value
articleRecord["publishDate"] = Date() as CKRecord.Value

// 保存到数据库
CKContainer.default().privateDatabase.save(articleRecord) { ... }

2. 文件(Assets)

本质

文件(CloudKit 中称为 CKAsset)用于存储非结构化的二进制数据,如图片、视频、文档等大型文件。

存储方式

  • 非结构化存储:以二进制形式存储,无格式限制(任意文件类型)。
  • 间接关联到记录:文件本身不直接存在于数据库中,而是存储在 CloudKit 的文件存储服务中,仅在记录中保存一个引用(CKAsset 对象) 指向文件。
  • 大小限制:单个文件最大支持 50GB(但实际受限于 iCloud 存储空间和网络条件)。

典型用途

  • 图片(用户头像、相册照片)
  • 视频/音频(录制的视频、语音消息)
  • 文档(PDF、Excel 等附件)
  • 其他大型二进制数据(压缩包、备份文件)

操作示例

// 1. 准备本地文件URL(如一张图片)
guard let imageURL = Bundle.main.url(forResource: "example", withExtension: "png") else { return }

// 2. 创建CKAsset关联文件
let imageAsset = CKAsset(fileURL: imageURL)

// 3. 将Asset存入记录的字段中
let photoRecord = CKRecord(recordType: "Photo")
photoRecord["image"] = imageAsset as CKRecord.Value // 存储的是引用,而非文件本身
photoRecord["caption"] = "旅行照片" as CKRecord.Value

// 4. 保存记录(文件会自动上传到CloudKit的文件存储)
CKContainer.default().privateDatabase.save(photoRecord) { ... }

核心区别总结

维度 记录(Records) 文件(Assets)
数据类型 结构化数据(文本、数字、日期等) 非结构化二进制数据(图片、视频等)
存储位置 直接存储在 CloudKit 数据库中 存储在文件服务,记录中仅存引用
大小限制 单条记录 ≤ 1MB 单个文件 ≤ 50GB
访问方式 直接从记录字段读取 通过记录中的 CKAsset 引用加载
适用场景 小型结构化数据 大型文件或二进制数据

最佳实践

  • 记录存储结构化元数据,用文件存储大型二进制内容(如一条"朋友圈"记录中,文字内容存在记录字段,配图用 CKAsset 存储)。
  • 避免在记录中存储大量文本(如整篇文章),超过 1MB 需拆分为记录+文件。
  • 读取文件时注意网络状态,建议实现本地缓存(如下载后保存到沙盒,避免重复下载)。

通过这种分离设计,CloudKit 既能高效管理结构化数据,又能灵活处理大型文件,兼顾了性能和扩展性。