CoreData 使用transformable类型存储数组

最近项目中要做本地缓存,所以就选择了简单的CoreData进行存储,存储的时候遇到一个问题就是CoreData中无法存储数组,只能存储像Int、String、Date等这种基本数据类型,看了看有一个自己不熟悉的类型Transformable,上网查了下他可以解决数组、字典、图片等存储问题。

今天我们分享一个使用CoreData的小技巧。CoreData是一个相当神器的API。今天我们来解决一个包含非基本数据类型的实体存储问题。

Transformable 数据类型拥有把属性(NSArray、UIIMage、JSON 数据等)转成NSData存储,获取时再转成相应对象的能力 。

为了介绍Transformable在CoreData实体存储中的使用,我们创建一个Event实体如下图:

《CoreData 使用transformable类型存储数组》 123123.png

在右侧数据模型审查器(Data Model Inspector)我们把numbersArray设置成了Transformable类型,并且把name设置成了NumbersArray. 这个名字可以自己随意取,一会我们会用这个名字作为自定义类的名字并实现transformable

接下来选中Event实体,选择 Editor > Create NSManagedObject Subclass…. 好的,你自定义的类就创建成功了。注意其中numbersArray的类型是id类型,你可能不知道怎么实现了。他会在运行时通过NSValueTransformer子类处理。我们在Event.h中定义一个NSValueTransformer的子类:

@interface Event : NSManagedObject

@property (nonatomic, retain) NSDate * timeStamp;
@property (nonatomic, retain) id numbersArray;

@end

@interface NumbersArray : NSValueTransformer
@end

其中NumbersArray是刚才你给numbersArray变换类型起的名字,并且他继承自NSValueTransformer。现在我们看下在.m文件中如何实现。

#import "Event.h"

@implementation Event

@dynamic timeStamp;
@dynamic numbersArray;

@end

@implementation NumbersArray

+ (Class)transformedValueClass
{
return [NSArray class];
}

+ (BOOL)allowsReverseTransformation
{
return YES;
}

- (id)transformedValue:(id)value
{
return [NSKeyedArchiver archivedDataWithRootObject:value];
}

- (id)reverseTransformedValue:(id)value
{
return [NSKeyedUnarchiver unarchiveObjectWithData:value];
}
@end

我们实现一些方法来指明这个类将要转换成什么,并且允许在转换数值和反向转换数值之间变换。

主要函数是

transformedValue:

把NSArray转换成NSData使用NSKeyedArchiver

reverseTransformedValue:

把NSData转换成NSArray使用 NSKeyedUnarchiver

到此自定义存储类型就结束了,快去试试吧。

更多iOS、Android开发精彩文章请关注微信公众账号:乐coding,你也可以扫描下方二维码关注我们。

《CoreData 使用transformable类型存储数组》 qrcode_for_gh_af22362bf4bb_258.jpg

    原文作者:LvesLi
    原文地址: https://www.jianshu.com/p/fcbff4ebfa10
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞