Sqlite作为fopen()的替代?

时间:2009-03-29 11:48:46

标签: c++ c sqlite fopen

official sqlite3 web page上有人写道我应该考虑将sqlite替换为fopen()函数。

你怎么看?使用sqlite补充应用程序内部数据存储总是很好的解决方案吗?这种解决方案的优点和缺点是什么?

你有一些经验吗?

编辑: 你的经历怎么样?这个容易用吗?是痛苦还是快乐?你喜欢吗?

4 个答案:

答案 0 :(得分:10)

这取决于。有一些禁忌症:

  • 对于配置文件,使用纯文本或XML比使用关系数据库更容易调试或更改,即使是像SQLite一样轻量级的数据库。

  • 使用(例如)XML比使用关系表更容易描述树结构

  • SQLite API的记录非常糟糕 - 没有足够的示例,并且超链接很差。 OTOH,如果你想挖掘它,那么信息就在那里。

  • 直接使用特定于应用的二进制格式将比在数据库中存储与BLOB相同的格式更快

  • 数据库损坏可能意味着所有您的数据而不是单个错误文件中的数据

OTOH,如果您的内部数据与关系模型非常吻合,并且如果有很多内容数据,我会推荐SQLite - 我自己将其用于我的一个项目。

关于经验 - 我使用它,它运行良好,并且易于与现有代码集成。如果文档更容易导航,我会给它5星 - 因为它是我给它四。

答案 1 :(得分:4)

与往常一样,没有“一刀切”的解决方案

如果您需要将数据存储在独立文件中,并且您可以利用SQL数据库的关系数据库功能,而不是SQLite。

如果您的数据不适合关系模型(例如分层数据),或者您希望数据具有人类可读性(配置文件),或者您需要与其他系统进行互操作,那么SQLite将不会非常有用和XML可能会更好。

另一方面,如果您需要同时从多个程序或计算机访问数据,那么SQLite不是最佳选择,您需要一个“真正的”数据库服务器(MS SQL,Oracle,MySQL,PosgreSQL)。 ..)。

答案 2 :(得分:1)

SQLite的原子性是一个优点。知道如果你中途写一些数据(可能在中间崩溃),它不会破坏你的数据文件。我通常通过在成功加载时备份文件来完成与xml配置文件类似的操作,并且任何将来失败的加载(指示损坏)都会自动恢复上次备份。当然,它不是那么精细,也不是原子的,但它足以满足我的欲望。

答案 3 :(得分:1)

我觉得SQLite很乐意与之合作,但我不认为它是fopen()的一个通用的替代品。

作为一个例子,我刚刚编写了一个软件,它从Web服务器下载图像并在本地缓存它们。将它们存储为单个文件,我可以在Windows资源管理器中观看它们,这当然有好处。但我需要保留一个在URL和图像文件之间映射的索引,以便使用缓存。 将它们存储在一个SQLite数据库中,它们都位于一个整齐的小文件中,我可以通过URL访问它们(从缓存中选择imgdata,其中url ='http://foo.bar.jpg')。