我正在学习使用Core Data,我有一些建模数据的想法。作为一个试图学习德语的人,我正在制作一个日志簿,记录短语和它们周围的一些上下文,比如文本的语言、注释和可能的翻译。
第一个念头
这是一个非常简化的模型:
class Phrase: NSManagedObject {
@NSManaged var text: String
@NSManaged var language: String
@NSManaged var translations: Set<Phrase>
@NSManaged var note: String?
}
translations
属性将是一对多关系。考虑到Core Data存储数据的方式,这可能吗?
第二想法
在我的研究中,听起来我可能需要一个中间对象来促进连接表。更像这样:
class Phrase: NSManagedObject {
@NSManaged var text: String
@NSManaged var language: String
@NSManaged var translations: Set<Translation> // one-to-many: Translation.input
@NSManaged var note: String?
}
class Translation: NSManagedObject {
@NSManaged var input: Phrase // one-to-many: Phrase.translations
@NSManaged var text: String
@NSManaged var language: String
@NSManaged var note: String?
}
结论我觉得我可能想错了这个问题。对于这个结构有没有更好的模型?这两种方法都可以,但重要的是要了解Core Data与关系数据库的不同之处。在这两种情况下,Core Data都会抱怨没有反向关系。它期望在两端都有一个关系的属性。在第一种情况下,它会期望第二种关系,你可以称之为translatedFrom
或什么的。你不需要使用这种关系,但是在Core Data内部使用它是很好的。
除此之外,你可以采用任何一种方法。第二种方法的好处是,您可以在每个短语之外单独添加关于翻译的注释或其他数据。如果你不需要这个,就不要再使用第二个实体了。