是否可以在约束中包含 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 实体类型?的主要内容,如果未能解决你的问题,请参考以下文章