我应该问自己什么问题来确定我的 Core Data 应用程序是否需要 'primary key'?
What questions should I ask myself to determine if I need a 'primary key' for my Core Data app?
我正在 Swift 中使用 Core Data 构建一个简单的应用程序,并尝试决定是否应该在我的实体中存储唯一 ID。在我的研究中,我找到了这样做的例子和不这样做的例子,但我没有找到这种决定背后的任何明确原因。
请注意:
- 我有 RDBMS 背景,我知道 Core Data 是一个对象图,而不是关系数据库
- 我确实知道 Core Data 创建了一个 NSManagedObjectID
,但我如何确定它是否足够
我看到像 this 这样的帖子(顺便说一下,从 7 年前开始)列出了这些选项:
- 使用-[NSManagedObject objectID]。请注意,此 ID 是临时的,直到
对象是第一次保存,或者您调用
- [NSManagedObjectContext obtainPermanentIDsForObjects:error:] 使用 CFUUID 系列函数为您的每个对象生成一个 UUID
-awakeFromInsert 方法
- 创建您自己的类似主键的系统,在您的模型中存储一个整数并随着每个对象的创建递增它
但我没能找到很多关于哪些选项适用于哪些情况的信息。
我应该问自己什么问题来弄清楚 Core Data 的唯一标识符 (NSManagedObjectID) 是否是我所需要的,或者我是否应该超越它并选择将我自己的一个加入其中。
if Core Data's unique identifier (NSManagedObjectID) is all I need
具体需要什么用途?
Core Data在内部维护了它的对象的主键,所以你基本上不需要自己实现它们。在 CD 中,您与已经具有建立关系机制的对象进行交互。您只需将一个 NSManagedObject
分配给另一个 NSManagedObject
的 属性,这将代表 O2O 或 O2M 关系,如下所示:
anotherObject.parent = oneObject;
对于多边会有一套。看看 documentation.
唯一需要某种外键的情况是将数据与某些网络服务同步时。
如果您需要在用户默认设置中存储对某些特定 NSManagedObject
的引用,您可能对此 post 感兴趣。
顺便说一下,还有 [[NSUUID UUID] UUIDString]
。
在 Core Data 中使用您自己的唯一 ID 的唯一原因是您曾经将数据同步到其他设备或 Web 服务。 NSManagedObjectID
足以供本地使用,但它们不能很好地用于同步。例如,如果您从后端服务器获取数据,它可能具有唯一 ID,但您不能强制 Core Data 使用它们。同样,即使您同步到另一台 iOS 设备,您也不能强制第二台设备上的 Core Data 使用与第一台设备相同的 NSManagedObjectID
。
对于本地使用,NSManagedObjectID
即可。如果您需要在用户默认值中保存对托管对象的引用,您可以存储它。稍后您可以使用 object(with:)
或 existingObject(with:)
快速检索托管对象。
我正在 Swift 中使用 Core Data 构建一个简单的应用程序,并尝试决定是否应该在我的实体中存储唯一 ID。在我的研究中,我找到了这样做的例子和不这样做的例子,但我没有找到这种决定背后的任何明确原因。
请注意:
- 我有 RDBMS 背景,我知道 Core Data 是一个对象图,而不是关系数据库
- 我确实知道 Core Data 创建了一个 NSManagedObjectID
,但我如何确定它是否足够
我看到像 this 这样的帖子(顺便说一下,从 7 年前开始)列出了这些选项:
- 使用-[NSManagedObject objectID]。请注意,此 ID 是临时的,直到 对象是第一次保存,或者您调用
- [NSManagedObjectContext obtainPermanentIDsForObjects:error:] 使用 CFUUID 系列函数为您的每个对象生成一个 UUID -awakeFromInsert 方法
- 创建您自己的类似主键的系统,在您的模型中存储一个整数并随着每个对象的创建递增它
但我没能找到很多关于哪些选项适用于哪些情况的信息。
我应该问自己什么问题来弄清楚 Core Data 的唯一标识符 (NSManagedObjectID) 是否是我所需要的,或者我是否应该超越它并选择将我自己的一个加入其中。
if Core Data's unique identifier (NSManagedObjectID) is all I need
具体需要什么用途?
Core Data在内部维护了它的对象的主键,所以你基本上不需要自己实现它们。在 CD 中,您与已经具有建立关系机制的对象进行交互。您只需将一个 NSManagedObject
分配给另一个 NSManagedObject
的 属性,这将代表 O2O 或 O2M 关系,如下所示:
anotherObject.parent = oneObject;
对于多边会有一套。看看 documentation.
唯一需要某种外键的情况是将数据与某些网络服务同步时。
如果您需要在用户默认设置中存储对某些特定 NSManagedObject
的引用,您可能对此 post 感兴趣。
顺便说一下,还有 [[NSUUID UUID] UUIDString]
。
在 Core Data 中使用您自己的唯一 ID 的唯一原因是您曾经将数据同步到其他设备或 Web 服务。 NSManagedObjectID
足以供本地使用,但它们不能很好地用于同步。例如,如果您从后端服务器获取数据,它可能具有唯一 ID,但您不能强制 Core Data 使用它们。同样,即使您同步到另一台 iOS 设备,您也不能强制第二台设备上的 Core Data 使用与第一台设备相同的 NSManagedObjectID
。
对于本地使用,NSManagedObjectID
即可。如果您需要在用户默认值中保存对托管对象的引用,您可以存储它。稍后您可以使用 object(with:)
或 existingObject(with:)
快速检索托管对象。