压缩CoreData数据

问题描述 投票:0回答:1

我使用 Transformable 类型在 CoreData 中存储包括复杂字典的数据。
我注意到随着时间的推移,CoreData sqlite 数据库变得相当大。

我测试了将数据存储为二进制数据类型(NSData),并在保存之前使用 lz4 压缩数据。我可以减少 30% 的大小(使用 lzma 可以减少 45%)。

由于 Transformable 类型通常会执行相同的操作(转换为数据对象),我想知道是否可以使用这种方式启用压缩。

swift core-data compression
1个回答
0
投票

是的,如果您实现自己的值转换器。默认情况下,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
,即使应用程序可以正常工作。在类中的某个位置放置一个断点以验证它是否正在被使用。

最后,一定要考虑这一切的影响。执行此操作时,您的性能取决于数据存储大小。您节省了多少数据,与压缩和解压缩对性能的影响相比如何?确保它物有所值。

© www.soinside.com 2019 - 2024. All rights reserved.