我有一个应用程序,它在由 MagicalRecord 管理的 CoreData 存储中具有三 (3) 个实体;我有整个应用程序的一 (1) 个 managedObject。在第 28 页,该书指出:
“假设您已向托管对象添加了 uniqueIdentifier 属性,”</p>
这是否意味着我需要为每个实体提供一个唯一标识符,还是需要一个?如果我只需要一个,我应该把它放在哪个实体中,或者它没有任何区别。(该示例只有 1 个实体,因此存在问题):-}
我有一个应用程序,它在由 MagicalRecord 管理的 CoreData 存储中具有三 (3) 个实体;我有整个应用程序的一 (1) 个 managedObject。在第 28 页,该书指出:
“假设您已向托管对象添加了 uniqueIdentifier 属性,”</p>
这是否意味着我需要为每个实体提供一个唯一标识符,还是需要一个?如果我只需要一个,我应该把它放在哪个实体中,或者它没有任何区别。(该示例只有 1 个实体,因此存在问题):-}
每个实体都需要唯一标识符的属性。该实体的每个实例的值应该是唯一的。
唯一标识符的值在同一实体类型的其他实例中必须是唯一的。
如果您有三个实体 , Entity1
, Entity2
,Entity3
那么您可以拥有一个Entity1
标识符为“42”的实例、一个标识符为“42”的实例Entity2
以及另一个Entity3
标识符为“42”的实例,而不会导致任何问题。
编辑
您说每个实体都需要一个属性……对于该实体的每个实例,该属性应该是唯一的。该值在其他实例中必须是唯一的......但是您给出了 Entity1、2 和 3 的示例,其中标识符对于所有三个都是相同的!我很困惑...... – SpokaneDude
这是正确的。实体描述了托管对象类的属性和关系(这就是为什么表示实体的类被命名为NSEntityDescription
)。实体本身不是托管对象。
因此,对于模型中定义的每个实体,您需要有一个唯一的标识符属性。该唯一标识符的值在该特定类型实体的实例中必须是唯一的。
如果您有 100 个实例,Entity1
那么每个实例的唯一标识符必须具有不同的值,相对于Entity1
.
如果您有 100 个实例,Entity2
则每个实例的唯一标识符必须具有不同的值,相对于所有其他实例,Entity2
但它们不必在实例的标识符中唯一,Entity1
因为标识符必须是唯一的-实体。
好的,最后一个问题(我希望)。该应用程序适用于书店;每个独特的书店是否都有一 (1) 个在不同员工的 iPad 中共享的 UUID?如果我有另一个应用程序(比如理发店调度),UUID 是否与书店的 UUID 不同?最后,特定书店的 UUID 值是否会发生变化?– 斯波坎杜德
Bookstore
因此,我假设您的核心数据模型有一个以一些属性命名的实体。您需要确保这些属性之一将唯一标识 entity 的每个托管对象实例Bookstore
。
如果您有一个属性name
,并且您确定永远不会有两个Bookstore
具有相同名称的实例,那么您可以将name
其用作您的唯一标识符。
但是,如果可能有多个对象实例可能具有相同的属性,但仍表示不同的对象,那么您需要一个特殊的属性,其唯一目的是保证唯一性。
例如,假设您的应用程序从服务器获取 JSON 数据。同时,您的用户在他们的 iPad 和 iPhone 上运行该应用程序。他们都阅读了一份记录,该记录描述了一个Bookstore
名称为“鲍勃的书”和地址“42 Mall Drive”的记录。
每个设备在其本地数据库中创建实例。
当需要同步这两个实例时,同步算法如何知道您是否有两个具有相同值的完全不同的对象,或者您是否有两个完全相同的对象的副本?
这就是唯一标识符的来源。你告诉集成框架每个实体的哪个属性可以用来判断对象是否真的相同。然后,当它看到两个不同的对象时,它可以查看唯一标识符并确定这两个对象是否真的是同一个对象,或者它们是否是两个完全独立的实例。
因此,对于每个实体,您需要确保始终可以使用其中一个属性来以这种方式唯一标识对象。如果您的模型中没有这样的属性,那么您应该为实体添加一个,并确保该属性在该特定实体的实例中是唯一的。
唯一标识符只需在同一数据库中同一实体的实例之间是唯一的。但是,当我还没有某个唯一属性时,我一直使用NSUUID
它来生成我的唯一标识符。