是否可以在约束中包含 Core Data 实体类型?

Posted

技术标签:

【中文标题】是否可以在约束中包含 Core Data 实体类型?【英文标题】:Is it possible to include Core Data entity type in constraint? 【发布时间】:2018-11-10 01:20:06 【问题描述】:

我正在使用 Core Data + Swift 4.2 + Xcode 10。在我的数据模型中,我有一个没有父实体的抽象实体 A,以 A 作为其父实体的实体 B,以及以 A 作为其父实体的 C父母。

实体 A 有一个时间戳字段,因此由 B 和 C 继承。我想施加一个约束,即时间戳在实体类型中必须是唯一的。也就是说,我希望所有 B 项都具有唯一的时间戳,并且所有 C 项都具有唯一的时间戳,但是某些 B 项可能与某些 C 项具有相同的时间戳。

有没有办法在 Xcode 中表达这种约束?实体编辑器中的“约束”字段需要属性列表。时间戳是一个属性,所以可以,但实体类型(B 或 C)不是。所以我看不到包含实体类型的方法。

实体类型有可能是隐式属性吗?这里只是在黑暗中拍摄。

编辑:要清楚,我要问的原因是我试图保存一个带有时间戳 T1 的 B 实例和一个带有时间戳 T1 的 C 实例,并且我得到一个错误,即约束是违反。我希望这两个实例都能被保存(也许这是我的一厢情愿)。如果有影响,我正在使用 Sqlite 后端。

【问题讨论】:

在不知道你的代码具体是什么样子的情况下,我只能用“诗人物理学”的术语来说话。也就是说,您可以考虑在创建实体的任何地方创建一个方法,以在创建实体之前测试“唯一性”。 感谢您的回复。我希望为这两个对象分配相同的时间戳,因为它们是同时创建的。我正在通过使一个时间戳与另一个时间戳略有不同来解决这个限制,但这并不令人满意;我宁愿直接表达有效约束在组合(实体类型,约束)上的概念。 Apple 在使用 Sqlite 时发出此警告:“使用 SQLite 持久存储时要小心实体继承。从另一个实体继承的所有实体都存在于 SQLite 的同一个表中。” 明白,但是,我认为人们不能断定这是不可能的。事实上,我看到 Core Data 已经构建了与 A 对应的表,其中包含一个字段 Z_ENT,该字段根据子实体而有所不同。从表面上看,期望目标的直接实现似乎是将 Z_ENT 包含在为表声明的约束中。 【参考方案1】:

我认为您不能在 Core Data 中自动指定此行为。但是您可以通过向实体 A 添加另一个属性,然后对该属性和时间戳的组合进行约束来实现这一点。

在本例中,我将subtype 添加到实体A,并指定了subtype,timestamp 的约束。

这些是实体类:

class EntityA: NSManagedObject 
    @NSManaged var timestamp: String
    @NSManaged var subtype: String

class EntityB: EntityA  
class EntityC: EntityA  

保存实体前需要正确设置subtype

entity.subtype = "B"

entity.subtype = "C"

或更笼统地说:

entity.subtype = entity.entity.name!

它并不漂亮,但它确实有效。

【讨论】:

感谢 Mike,如果 Core Data 能够公开一个自动生成的子类型属性会更整洁,但我可以看到这确实解决了问题。【参考方案2】:

我只是尝试做类似的事情。我最终能够使用该属性执行 switch 语句,然后使用 case is Entity:

switch variableEntity 
        case is EntityA:
            print("EntityA:")
        default:
            print("Default:")
        

【讨论】:

以上是关于是否可以在约束中包含 Core Data 实体类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何添加类型约束以在泛型方法中包含任何可序列化的内容?

在实体中包含集合是不是违反了实体的本应?

是否可以在 openoffice 的用户类型中包含 Sub? VBA

Core Data 中线程安全的唯一实体实例

是否可以在对象模式中包含不同的键?

Hibernate - 是不是需要在父实体中包含 Set 和 OneToMany 注释?