TL;DR: Core Data 和 SwiftData 利用 SQLite 内部的
Z_PK
(自增 ID)和Z_ENT
(实体类型)自动管理主键,无需手动设置主键,确保数据唯一性和完整性。
疑问
在使用 Core Data 或 SwiftData 进行 iOS 开发时,很多开发者都会有一个疑问:为什么不像传统数据库那样需要设置主键?
解答
其实,这两个框架在底层的 SQLite 数据库中已经自动实现了一套完整的主键管理机制,无需开发者额外定义:
- 自动递增的主键 (
Z_PK
):每个实体表都会包含一个从 1 开始递增的Z_PK
字段,作为自增主键。 - 实体标识 (
Z_ENT
):每个实体表会添加一个Z_ENT
字段,用于标识表的实体类型。 - 唯一定位记录 (
Z_PK + Z_ENT
):通过Z_PK
和Z_ENT
的组合,可以在整个数据库中唯一定位一条记录。 - 主键值管理 (
Z_PRIMARYKEY
):Core Data 会通过Z_PRIMARYKEY
表来管理每个实体表的主键自增值(Z_MAX
),确保每次插入新记录时能够分配正确的主键。
正因为框架在底层已经自动实现了这套机制,开发者在数据模型设计时既无需手动创建主键,也无法自定义自增主键。这种设计不仅简化了开发过程,还确保了数据的唯一性和完整性。
友情提示:
如果需要将数据导出,建议在模型中添加一个标识符属性(例如 UUID)。这样可以确保数据导出后依然能够正确维护记录间的关系。