我是Core Data的新手,并且在概念上与其中的一些进行斗争(相对于SQL,我理解)。
我正在尝试构建一个为简单起见的模型:
"Category" entity, which has a name, and a relationship to-many Products
"Product" entity, which has a name
我希望两个实体中的name
个(字符串)存储本地化变体。这意味着另一次加入。有少量可能的本地化。我知道我可以将每个本地化作为一个单独的属性(“name_en”,“name_de”等),但这不能扩展,我想要理解实现这一目标的“正确”方法。
我的直觉告诉我,我想在这里再增加两个实体,一个是Localizations(实际上只包含一组可能的本地化),另一种是LocalizedString,它与Localization有关。但Xcode警告我不要设置反向关系等等。
可以深入了解Core Data模型设计的人请帮助新手了解如何思考这个问题吗?
(我的下一个问题是构建一个奇怪的多方向UI,让你为每个可用的本地化设置名称,但这将是另一组调查。:))
答案 0 :(得分:14)
我不知道我是否有资格成为那些了解核心数据的人,但我过去曾经使用过这样的东西:
name
中的 Something
是英文名称。因此,我不必在英语设备中搜索关系(其中我的应用程序覆盖了70%的设备)
并且在localizedName
子类中有一个名为Something
的getter,它返回名称或当前使用的语言代码的字符串。
当我这样做时,我认为我可以将本地化字符串保存在name属性中,因为语言通常不会在开发人员不使用的设备上经常更改。但最后我决定反对这一点,因为这不是性能问题。
我认为可以用来对抗不存在的性能问题的另一种变体:
currentLanguageString基本上指向当前语言的本地化字符串。每次语言更改时都会更改(在99.9%的情况下,这种情况会在应用程序首次启动时发生一次)。
如果Something
实体中有多个字符串,我会使LocalizedString
为专门为要本地化的字符串创建的子类的抽象父类。
您必须使用这种奇怪的结构,因为您无法创建与多个实体的关系。
或者如果您知道自己在做什么,请忽略“无反向关系”警告
但如果你这样做,你必须确保你永远不会删除仍在使用的LocalizedString
对象。您不希望以不一致的存储结束。