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

Stu*_*ner 29 core-data nsarray ios

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

Res*_*h32 37

如果你真的需要这样做,那么编码为数据.我只是创建了一个名为receiveNSData(二进制数据)的新文件.

然后在NSManagedObject实现中:

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

-(NSArray*)getReceiveList{
    return [NSKeyedUnarchiver unarchiveObjectWithData:self.receive];
}
Run Code Online (Sandbox Code Playgroud)


que*_*ish 29

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

可转换属性背后的想法是您将属性作为非标准类型访问,但在幕后,Core Data使用NSValueTransformer的实例将属性转换为NSData实例和从NSData实例转换属性.然后,Core Data将数据实例存储到持久性存储中.

可转换属性使用NSValueTransformer在持久性存储中存储否则不受支持的对象.这允许Core Data存储几乎任何可以表示为NSData的东西 - 这可能非常有用.遗憾的是,转换属性不能在谓词中匹配,也不能用于使用NSSQLiteStoreType对结果进行排序.这意味着可转换属性仅对存储有用,而不是对象的发现.

默认转换器允许任何支持NSCoding(或NSSecureCoding)的对象存储为可转换属性.这包括NSArray,UIColor,UIImage,NSURL,CLLocation,和其他许多人.不建议将此用于可以任意大的数据,因为在查询商店时会对性能产生重大影响.例如,图像不适合可转换的属性 - 它们是大块的字节,可以分割商店.在这种情况下,最好使用Core Data的外部记录存储功能,或者将数据作为文件单独存储,并将URL存储在Core Data中的文件中.如果您必须存储UIImage核心数据,请确保您知道所涉及的权衡.

创建可转换属性很简单:

•在Xcode Core Data Model Editor中,选择要修改的模型属性.在右侧检查器中,将属性类型设置为"可转换".您可以将"名称"字段留空以使用默认转换器.如果您使用自定义转换器,则应在此处输入类名,并使用+[NSValueTransformer setValueTransformer:forName:]代码中的某个位置注册类.

核心数据模型编辑器可转换属性

•在NSManagedObject子类标头中,声明描述具有正确类型的可转换属性的属性.在这种情况下,我们正在使用NSArray:

@property (nonatomic, retain) NSArray *transformedArray;

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

@dynamic transformedArray;

你完成了.将NSArray值对象传递给setTransformedArray:该数组时,该对象将保留该数组.当上下文被保存核心数据将改造NSArrayNSData使用NSValueTransformer在模型中描述.该NSData字节将被保存在持久性存储.


Phi*_*gan 26

您不会将NSArray本机存储在Core Data中.您需要将存储数组中的值转换为Core Data可以使用的值,然后将数据保存在存储中,以便您可以NSArray根据需要将其推送到您的位置.

  • 投票没有评论?并非特别有用,因为答案实际上并没有错. (11认同)
  • 问题是关于*transformable attributes*,它是在Core Data中存储NSArray或其他复杂对象的完全合适的方法. (6认同)

Hel*_*ker 8

菲利普的回答是对的.您不在Core Data中存储数组.这完全违背了Core Data的用途.大多数情况下,您不需要数组的信息,但是一个可以由Core Data动态加载.在集合的情况下,如果你遍历任何属性的数组或者取来的数组NSSet(基本上只是一个数组)也没有区别.

以下是菲利普所说的解释.您不能直接存储数组,但可以从中创建属性列表.所有NS Arraytypes中都有一个方法可以为您提供一个漂亮而干净的字符串和核心数据.存储为字符串的属性列表很酷,它们可以变成它们的样子.有一种方法可以用NSString.TATAAA ...

当然有代价.作为属性列表的数组可能会变得很大,而且对于RAM有限的iOS设备而言,这种情况并不顺利.尝试将数组保存到核心数据表明实体设计较差,特别是对于大数据.出于速度原因,小阵列是可以的.

另一种占用空间较少的方法是使用二进制属性列表.当存储在Core Data中或直接存储在文件系统中时,它们接近于zip大小.缺点是,您不能像XML或JSON文件那样简单地打开和读取它们.对于开发,我更喜欢人类可读的东西并发布二进制版本.DEBUG与预处理器中的值相关联的常量负责处理,因此我不必更改代码.

  • 哎哟.是的,我做错了翻译,并在情感上做出了更多回应.我很抱歉. (3认同)