0

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

谢谢。

4

3 回答 3

2

Prajwal 为优化 Core Data 存储提供了一些很好的通用技巧。但要回答您的具体问题:不,从转换NSStringNSData不会节省任何空间,实际上可能会使用更多空间。NSData不做任何压缩。要转换为NSData你想要的东西

NSData *myData = [myString dataUsingEncoding:NSUTF8StringEncoding];

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

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

如果您需要减小数据存储的大小,请在描述数据模型的位置提出另一个问题。根据您的数据模型的外观,应用不同的技术。

于 2013-01-25T23:05:58.740 回答
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;
    }
    

正如其他人提到的那样,压缩小字符串并没有任何好处,因此您可能希望在模型中添加一个布尔值,以指示数据是否实际被压缩。

于 2013-01-26T11:37:03.223 回答
2

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

于 2013-01-25T09:36:07.540 回答