我应该问自己什么问题,以确定我是否需要一个主键'对于我的Core Data应用程序?

时间:2017-01-09 00:49:54

标签: ios core-data primary-key uniqueidentifier

我正在使用Core Data在Swift中构建一个简单的应用程序,并尝试决定是否应该在我的实体中存储唯一的ID。在我的研究中,我已经找到了这样做的例子和不做的例子,但我还没有找到任何明确的理由支持这种决定。

请注意: - 我来自RDBMS背景,我知道Core Data是一个对象图,而不是关系数据库 - 我知道Core Data会创建一个NSManagedObjectID,但我如何确定这是否足够

我看到像this这样的线程(从7年前开始,顺便提一下),它们列出了这些选项:

  • 使用 - [NSManagedObject objectID]。请注意,此ID是临时的,直到 要么首次保存对象,要么致电
  • [NSManagedObjectContext obtainPermanentIDsForObjects:error:]使用CFUUID函数族为您的每个对象生成一个UUID -awakeFromInsert方法
  • 创建您自己的类似主键的系统,该系统在模型中存储一个整数,并通过创建每个对象来增加它

但我还没有找到关于哪些选项适合哪些情况的大量信息。

我应该问自己什么问题,以确定Core Data的唯一标识符(NSManagedObjectID)是否是我需要的,或者我是否应该超越它并选择将我自己的一个包含在混合中。

2 个答案:

答案 0 :(得分:0)

  

如果核心数据的唯一标识符(NSManagedObjectID)是我需要的全部

究竟需要什么目的?

Core Data在内部维护其对象的主键,因此您基本上不需要自己实现它们。在CD中,您与已经具有建立关系机制的对象进行交互。您只需将一个NSManagedObject分配给另一个NSManagedObject的属性,这将代表O2O或O2M关系,如下所示:

anotherObject.parent = oneObject;

对于许多方面来说,会有一套。看看documentation

当您需要某种外键时,唯一的情况是将数据与某些Web服务同步。

如果您需要在用户默认值中存储某些特定NSManagedObject的引用,则可能会对此post感兴趣。

顺便说一下,有[[NSUUID UUID] UUIDString]

答案 1 :(得分:0)

将自己的唯一ID与Core Data一起使用的唯一原因是您将数据同步到其他设备或Web服务。 MX-C30NT-B MX-C30NT-C MX-C30NT-M MX-C30NT-Y MX-C30DR MX-C30HB MX-C30NV-B MX-C30NV-C MX-C30NV-M MX-C30NV-Y ... 足以供本地使用,但它们不能很好地进行同步。例如,如果从后端服务器获取数据,它可能具有唯一ID,但您无法强制Core Data使用它们。同样,即使您同步到其他iOS设备,也无法强制第二台设备上的核心数据使用与第一台设备相同的NSManagedObjectID

对于本地使用,您只需要NSManagedObjectID。如果需要在用户默认值中保存对托管对象的引用,则可以存储该引用。稍后,您可以使用NSManagedObjectIDobject(with:)快速检索托管对象。