压缩sqlite数据,NSString还是NSData?

时间:2013-01-25 09:19:01

标签: ios core-data compression

我使用sqlite文件来存储数据,我存储的很多数据都是NSString格式,如果我将这些数据存储为NSData会使我的sqlite文件的大小变小吗?我还能做些什么来减少sqlite文件的大小吗?

感谢。

3 个答案:

答案 0 :(得分:2)

你可以这样做: 保存图片链接而非图片。 如果有大的描述,那么您可以通过服务器获取它。 删除多个数据。即; 重复数据 使用数据库中的数据删除可在运行时生成的数据。 执行规范化以优化数据库,这将避免和清理混乱(如果存在)。

答案 1 :(得分:2)

Prajwal提供了一些优化核心数据存储的一般提示。要回答您的具体问题:不,从NSString转换为NSData不会节省任何空间,实际上可能会占用更多空间。 NSData不进行任何压缩。要转换为NSData,您需要类似

的内容
NSData *myData = [myString dataUsingEncoding:NSUTF8StringEncoding];

但这无济于事,可能会让事情变得更糟。例如,如果您的字符串包含“é”,NSString表示一个字节。但UTF-8需要两个字节,因此NSData使用更多空间。

如果你真的想要压缩字符串,那么有一些开源实现可以为你提供压缩的NSData对象。不要这样做,除非你有一个很多的字符串数据,你知道它会压缩。它可能会节省空间,但(a)它会牺牲速度,而且(b)您将无法使用这些字符串来查找数据存储中的对象。

如果您仍然需要缩小数据存储的大小,请询问您描述数据模型的其他问题。根据您的数据模型的不同,适用不同的技术。

答案 2 :(得分:2)

正如其他人所说,SQLite / CoreData无法真正帮助您完成这项工作。您已经指出了正确的解决方案,即使用NSData在SQLite存储中存储原始字节并自行进行内存转换。

由于压缩本质上很昂贵,因此速度会非常慢。

以下是您需要做的事情:

  1. 将您的属性类型设置为NSData
  2. 查看libz并将其添加到Xcode中的项目
  3. 从libz中选择压缩风格
  4. 实施自定义属性以进行翻译

    - (NSString *)getAttrString {
         NSData *bytes = self.attr
         //decompress
    }
    
    - (void)setAttrString:(NSString *)s {
        NSData *d = //compress
        self.attr = d;
    }
    
  5. 正如其他人所提到的,压缩小字符串并没有什么好处,所以你可能想要在模型中添加一个布尔值来指示数据是否实际压缩。