在 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 既能高效管理结构化数据,又能灵活处理大型文件,兼顾了性能和扩展性。