我使用 Transformable 类型在 CoreData 中存储包括复杂字典的数据。
我注意到随着时间的推移,CoreData sqlite 数据库变得相当大。
我测试了将数据存储为二进制数据类型(NSData),并在保存之前使用 lz4 压缩数据。我可以减少 30% 的大小(使用 lzma 可以减少 45%)。
由于 Transformable 类型通常会执行相同的操作(转换为数据对象),我想知道是否可以使用这种方式启用压缩。
是的,如果您实现自己的值转换器。默认情况下,Core Data 使用
NSCoding
与二进制数据进行相互转换。您可以将其替换为您想要的任何代码,Core Data 将在适当的时间调用该代码。
首先实现变压器,作为
ValueTransformer
的子类。一个最小的实现是这样的
@objc(MyDataTransformer)
public final class MyDataTransformer: ValueTransformer {
public override func transformedValue(_ value: Any?) -> Any? {
// Your compression code here, returning Data
}
public override func reverseTransformedValue(_ value: Any?) -> Any? {
// Your decompression code here, returning your custom data type
}
}
接下来,您通过将其添加到模型编辑器中来告诉 Core Data 将其用于可转换属性。选择属性并在“转换器”字段中输入值转换器类名称。
Core Data 现在将在需要读取或保存属性时使用您的代码。
有一个 Xcode 错误(似乎已经存在了一段时间......),它抱怨您使用的类名没有
NSValueTransformer
,即使应用程序可以正常工作。在类中的某个位置放置一个断点以验证它是否正在被使用。
最后,一定要考虑这一切的影响。执行此操作时,您的性能取决于数据存储大小。您节省了多少数据,与压缩和解压缩对性能的影响相比如何?确保它物有所值。