我在哪里放置Ensembles uniqueIdentifier?

时间:2015-11-29 22:27:14

标签: objective-c core-data magicalrecord-2.2 ensembles

我有一个应用程序,在MagicalRecord管理的CoreData商店中有三(3)个实体;我有一个(1)托管对象为整个应用程序。在第28页,该书指出:

  

“假设您已向托管对象添加了uniqueIdentifier属性”,

这是否意味着我需要为每个实体提供uniqueIdentifier,还是会有人?如果我只需要一个,我应该把它放入哪个实体,或者它不会有任何区别。 (该示例只有1个实体,因此问题): - }

2 个答案:

答案 0 :(得分:2)

每个实体都需要唯一标识符的属性。对于该实体的每个实例,该值应该是唯一的。

唯一标识符的值在同一实体类型的其他实例中必须是唯一的。

如果您有三个实体Entity1Entity2Entity3,那么您可以拥有Entity1的实例,其标识符为“42”,实例为{{ 1}}标识符为'42,另一个Entity2实例标识符为'42',没有任何问题。

修改

  

你说每个实体都需要一个属性......它应该是唯一的   该实体的每个实例。该值必须是唯一的   实例......但是你给出了Entity1,2和3的例子   三个标识符都是一样的!我很困惑...... - SpokaneDude

这是对的。实体描述一类托管对象的属性和关系(这就是表示实体的类名为Entity3)的原因。实体本身不是托管对象。

因此,对于模型中定义的每个实体,您需要具有唯一标识符属性。该唯一标识符的值在该特定类型的实体的实例中必须是唯一的。

如果您有100个NSEntityDescription个实例,那么相对于Entity1的所有其他实例,每个实例必须具有不同的唯一标识符值。

如果您有100个Entity1个实例,则每个实例必须具有不同的唯一标识符值,相对于Entity2 的所有其他实例在Entity2的实例的标识符中必须是唯一的,因为标识符必须是每个实体唯一的。

  

好的,最后一个问题(我希望)。该应用程序适用于书店;做每个   独特的书店有一(1)个UUID,他们分享   不同员工的iPad?如果我有另一个应用程序(比如说)   理发店计划),是UUID不同于书店的   UUID?最后,UUID值是否会因特定情况而发生变化   书店? - SpokaneDude

因此,我假设您的核心数据模型有一个名为Entity1的实体,其中包含一些属性。您需要确保其中一个属性将唯一标识实体Bookstore的每个托管对象实例。

如果您有一个属性Bookstore并且您确定您将永远不会有两个具有相同名称的name个实例,那么您可以使用Bookstore作为您的唯一标识符。< / p>

但是,如果可能存在多个可能具有相同属性但仍代表不同对象的对象实例,则需要一个特殊属性,其唯一目的是保证唯一性。

例如,假设您的应用程序从服务器中删除了JSON数据。同时,您的用户在iPad和iPhone上运行应用程序。他们都阅读了描述名为“Bob's Books”的name的记录,并写下了“42 Mall Drive”。

每个设备都在其本地数据库中创建实例。

当需要同步这两个实例时,同步算法如何知道您是否有两个具有相同值的完全不同的对象,或者您是否拥有完全相同对象的两个副本?

这就是唯一标识符的来源。您告诉合奏框架,可以使用每个实体的哪个属性来判断对象是否真的相同。然后,当它看到两个不同的对象时,它可以查看唯一标识符并确定这两个对象是否真的是同一个对象,或者它们是两个完全独立的实例。

因此,对于每个实体,您需要确保始终可以使用其中一个属性以此方式唯一标识对象。如果模型中没有这样的属性,则应为实体添加一个属性,并确保该属性在该特定实体的实例中是唯一的。

唯一标识符在同一数据库中的同一实体的实例之间必须是唯一的。但是,当我没有某个唯一属性时,我一直使用Bookstore来生成我的唯一标识符。

答案 1 :(得分:1)

  1. 在每个实体上创建“guid”属性或类似内容,并在每条新记录上设置为UUID(也包括所有现有记录)。
  2. 检查合奏示例。