配置核心数据实体以存储NSArrays / NSSets等

时间:2013-08-12 16:08:00

标签: ios objective-c core-data

我想将一些对象存储到Core Data中,除了其他标量变量外,还包含集合。

例如,我可能希望保留数千个“机器”对象:

@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问题,但似乎没有就如何实现这一目标达成一致的明确共识。我想要serialize the collections into Binary Data attributes吗?或者我应该utilize the "transformable" type?或者我想要make several one-to-many relationships

从我读过的内容来看,这些解决方案中最后一个对我来说是最吸引人的,虽然我不确定它在我的情况下是否最有意义,其中集合仅包含NSNumbers / NSStrings而不是其他自定义对象(几乎所有使用此方法的解决方案似乎都是理所当然的。)

如果你可以通过解释当上述每种策略在情境上最有效以及你认为我应该适用于我自己的情景时能够启发我,我将非常感激!

此外,如果答案是“使用一对多关系” - 这是否意味着我需要为每个集合类型变量创建一个独特的实体?最终,如果我将这个应用于我需要持久存在的所有对象,这将导致数十个具有一对多关系的实体;这是可以预料的,还是我想错了?

谢谢!

1 个答案:

答案 0 :(得分:0)

序列化为二进制数据属性并使用可转换属性实际上是相同的,以不同的方式实现。两者都涉及将您的馆藏转换为NSData

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

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