【问题标题】:What questions should I ask myself to determine if I need a 'primary key' for my Core Data app?我应该问自己哪些问题来确定我的 Core Data 应用程序是否需要“主键”?
【发布时间】:2017-05-23 05:09:44
【问题描述】:

我正在使用 Core Data 在 Swift 中构建一个简单的应用程序,并尝试决定是否应该在我的实体中存储一个唯一的 id。在我的研究中,我发现了这样的例子和不这样做的例子,但我没有发现这种决定背后的任何明确原因。

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

我看到像 this (顺便说一下,从 7 年前)这样的帖子,其中列出了这些选项:

  • 使用 -[NSManagedObject objectID]。请注意,此 ID 是临时的,直到 对象是第一次保存或调用
  • [NSManagedObjectContext gainPermanentIDsForObjects:error:] 使用 CFUUID 系列函数为您的每个对象生成一个 UUID -awakeFromInsert 方法
  • 创建您自己的类似主键的系统,在模型中存储一个整数并随着每个对象的创建而递增

但我找不到太多关于哪些选项适合哪些情况的信息。

我应该问自己哪些问题来弄清楚我是否只需要 Core Data 的唯一标识符 (NSManagedObjectID),或者我是否应该超越它并选择将我自己的一个标识符加入其中。

【问题讨论】:

  • 我不是 Core Data 编码员(只是涉足它),但我一直认为模型有两个可能的“来源”——mySQL 或 XML 文件。作为过去一生中的 MSSQL 人,我认为您喜欢的任何数据库设计都足以得到答案。事实上,我读过一些论点,CD 有时是一个不必要的层,而使用直接的 mySQL 设计可以简化事情。 (这些论点有时声称 CD 最大的优势是坚持。)

标签: ios core-data primary-key uniqueidentifier


【解决方案1】:

如果我只需要 Core Data 的唯一标识符 (NSManagedObjectID)

究竟需要什么目的?

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

anotherObject.parent = oneObject;

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

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

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

顺便说一句,还有[[NSUUID UUID] UUIDString]

【讨论】:

  • 我在考虑几个目的,例如 1) 我有一个 UISegmentedControl 来控制一些用户默认选择,并使这些 0 和 1 的唯一 ID 可以很容易地设置/更改选定的该控件的值并将索引值存储在NSUserDefaults 2) 避免在许多情况下使用String 匹配事物(但不是为了确定关系)和 3) 似乎更容易更改,例如,“描述' 特定唯一记录的属性,在我的应用发布后,该记录可能是“一对多”中的“一个”。
  • 然后我还看到非常聪明的 Apple 人 (vimeo.com/140037432) 在他们的示例中使用了 newTask.setValue(NSUUID().UUIDString, forKey: "id") 之类的东西,所以这让我觉得必须有一个很好的理由。
  • NSManagedObjectID 指的是特定商店中的特定对象。因此,如果您不需要与某些外部应用程序交换数据,则可以安全地使用它。请参阅文档的Overview 部分。
【解决方案2】:

在 Core Data 中使用您自己的唯一 ID 的唯一原因是您曾经将数据同步到其他设备或网络服务。 NSManagedObjectID 足以供本地使用,但它们不能很好地用于同步。例如,如果您从后端服务器获取数据,它可能具有唯一 ID,但您不能强制 Core Data 使用它们。同样,即使您同步到另一台 iOS 设备,您也不能强制第二台设备上的 Core Data 使用与第一台设备相同的NSManagedObjectID

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

【讨论】:

  • 冒着明显的风险,Tom,您是说如果我以后要添加使用 iCloud 跨 iOS 设备同步的功能,我需要管理自己的唯一 ID。对吗?
  • 是的,因为您不能在服务器端使用NSManagedObjectID。您需要一些其他 ID 来告诉服务器您正在更新什么,或者理解来自服务器的传入数据。
猜你喜欢
  • 2013-11-13
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多