核心数据示例代码中存储NSArray?

我一直在寻找一些关于如何在核心数据中存储NSArray示例代码,但是一直没有任何运气。 任何人都不介意给我一些教程或例子,或者更好地写一个简单的样本作为这个问题的答案? 我已经阅读了这个,但它没有显示如何去实现一个NSArray的可转换属性的例子。 提前致谢!

如果你真的需要这样做,那么编码为数据。 我简单地创build了一个名为receive作为NSData(二进制数据)的新字段。

然后在NSManagedObject实现中:

 -(void)setReceiveList:(NSArray*)list{ self.receive = [NSKeyedArchiver archivedDataWithRootObject:list]; } -(NSArray*)getReceiveList{ return [NSKeyedUnarchiver unarchiveObjectWithData:self.receive]; } 

可转换属性是在Core Data中保留其他不受支持的对象值(例如NSArray )的正确方法。 核心数据编程指南:非标准持久属性 :

可转换属性背后的思想是,你作为一个非标准types访问一个属性,但在后台Core Data使用NSValueTransformer的一个实例将属性转换为和来自NSData的一个实例。 核心数据然后将数据实例存储到持久性存储。

可转换属性使用NSValueTransformer在持久性存储中存储不支持的对象。 这允许Core Data存储任何可以表示为NSData的东西 – 这可能非常有用。 不幸的是,可变形属性不能在谓词中匹配,或者在使用NSSQLiteStoreTypesorting结果时使用。 这意味着可变形属性仅用于存储,而不是对象的发现。

默认转换器允许任何支持NSCoding (或NSSecureCoding )的对象作为可转换属性存储。 这包括NSArrayUIColorUIImageNSURLCLLocation等等。 build议不要将此用于可以任意大的数据,因为在查询商店时可能会有显着的性能影响。 例如,图像对于可变形的属性是不合适的 – 它们是将商店分割的大块字节。 在这种情况下,最好使用Core Data的外部logging存储function,或者将数据单独存储为文件,并将URL存储到Core Data中的文件中。 如果您必须在Core Data中存储UIImage ,请确保您知道所涉及的折衷。

创build可变形的属性很简单:

•在Xcode核心数据模型编辑器中,select要修改的模型属性。 在右侧检查器中,将属性types设置为“Transformable”。 您可以将“名称”字段留空以使用默认转换器。 如果您使用的是自定义转换器,则可以在此处input类名,并在代码中的某处使用+[NSValueTransformer setValueTransformer:forName:]注册该类。

核心数据模型编辑器可变形属性

•在您的NSManagedObject子类头中声明描述具有正确types的可变形属性的属性。 在这种情况下,我们使用NSArray

@property (nonatomic, retain) NSArray *transformedArray;

•在NSManagedObject子类实现文件中,属性应该是dynamic的:

@dynamic transformedArray;

你完成了。 当一个NSArray值对象被传递给setTransformedArray:该数组被对象保留。 保存上下文时,Core Data将使用模型中描述的NSValueTransformerNSArray转换为NSDataNSData字节将被保存在持久性存储中。

核心数据本身不存储NSArray 。 您需要将存储数组中的值转换为Core Data可以使用的值,然后将数据保存在存储中,以便可以根据需要将其推送到您的NSArray中。

菲利普的回答是对的。 您不要将数组存储在核心数据中。 这完全是针对Core Data的。 大多数情况下,您不需要数组的信息,但可以通过Core Datadynamic加载。 在集合的情况下,如果你遍历你的任何属性的数组或者在NSSet (基本上只是一个数组)上获取结果的数组,那么它没有任何区别。

这是菲利普说的解释。 您不能直接存储数组,但是可以从中创build一个属性列表。 在所有NS Arraytypes中都有一个方法,可以给你一个很好的干净的string和核心数据爱string。 关于存储为string的属性列表很酷的事情是,它们可以成为它们。 在NSString有一个方法。 TATAAA …

当然有一个价格。 作为财产清单的arrays可能会变得巨大,而且对于内存有限的iOS设备来说,这样做并不好。 试图将数组保存为核心数据表明实体devise较差,特别是对于大数据。 由于速度的原因,小arrays是可以的。

另一种更节省空间的方式是使用二进制属性列表。 当存储在核心数据中或直接存储在文件系统中时,这些数据接近于zip大小。 缺点是,你不能简单地打开和阅读他们像一个XML或JSON文件。 对于开发,我更喜欢一些人类可读的和释放二进制版本。 一个与预处理器中的DEBUG值相关的常量会照顾到这一点,所以我不必更改我的代码。

核心数据存储NSManagedObject的实例或其子类。 NSManagedObject本身非常像一本字典。 对象之间的多对多关系表示为集合。 核心数据没有对应于数组的有序列表。 相反,当您从核心数据存储中检索对象时,可以使用提取请求。 该获取请求可以指定一个或多个用于sorting对象的sorting描述符,并且由读取请求返回的对象存储在一个数组中。

如果保留对象的顺序非常重要,那么您需要在实体中包含一个属性,以便在您抓取对象时对其进行sorting。