配置核心数据实体以存储NSArray/NSSet等



我想将许多对象存储到核心数据中,这些对象除了包含其他标量变量外,还包含集合。

例如,我可能想要持久化几千个"机器"对象:

@interface Machine : NSObject <NSCopying>
{
    NSString *idNumber;
    BOOL existsInLibrary;
    NSSet *sections; // Contains a set of NSStrings
    NSSet *banks; // " "
    NSSet *positions; // " "
    NSMutableArray *orientationIDs; // Contains an array of NSNumbers
    NSMutableSet *credits; // Contains a set of NSNumbers
}

有许多类似的SO问题,但似乎并没有就如何实现这一点达成明确的共识。是否要将集合序列化为二进制数据属性?还是应该使用"可转换"类型?还是我想建立几段一对多的关系?

从我所读到的内容来看,后一种解决方案对我来说是最有吸引力的,尽管我不确定它在我的情况下是否最有意义,因为集合只包含NSNumbers/NSStrings,而不是其他自定义对象(几乎每个使用此方法的解决方案都认为这是理所当然的)。

如果你能启发我,解释一下以上每种策略在什么情况下最有效,以及你认为我应该应用于自己的场景,我将不胜感激!

此外,答案应该是"使用一对多关系"吗?这是否意味着我需要为每个集合类型变量创建一个不同的实体?最终,如果我将其应用于我需要持久化的所有对象,这将导致几十个具有一对多关系的实体;这是意料之中的事,还是我想错了?

谢谢!!

序列化为二进制数据属性和使用可转换属性实际上是一回事,实现方式有所不同。两者都涉及将集合转换为NSData

您应该使用哪种方法取决于您期望如何使用数据。序列化集合会更简单,但它有一个限制,即不能通过序列化值搜索对象。如果需要按数组值查找对象(例如,在其集合中查找具有sectionsbanks特定值的Machine实例),则序列化为二进制不是一个好方法。另一方面,如果这种情况从未发生过,它只会因为更简单的编写和维护而获胜。

如果对这些属性中的任何一个使用多对多关系,则需要为这些值创建一个新的实体类型。这可以是每个属性的不同实体类型。或者,如果它们都包含相同类型的数据,则可以使用一个通用实体类型,称为MachineRelatedItem。您将拥有与该实体类型的多对多关系。

最新更新