【问题标题】:SQLlite for "Save as" and Auto-save feature for a LARGE fileSQLite 用于“另存为”和 LARGE 文件的自动保存功能
【发布时间】:2012-04-04 08:18:36
【问题描述】:

我有一个可以轻松达到 1GB 的 SQLite 文件(可能变成 10GB)。我想为我的桌面应用程序(在 C++ 中)模拟“另存为”和自动保存功能,类似于 Office Word。 在我看来,每次要备份时都复制整个文件是不切实际的。

我刚刚开始调查SAVEPOINT。这是解决这个问题的方法吗?但我不清楚保存点是否允许我查询我刚刚在保存点之间进行的插入,直到我提交/释放。

我将不胜感激。

另外,退后一步,我正在考虑这种另存为/自动保存机制是否是个好主意。我目前正在将每个 SQL 命令立即保存到文件中(例如,将用户文本保存到表中的注释字段中)。我确实在应用程序中实现了撤消/重做功能。有人用大型 sqlite 文件制作桌面应用程序吗?

【问题讨论】:

  • SAVEPOINTS 用于交易。因此,您可以回滚事务的一部分,而不是全部。而且您真的不想在您的应用程序使用期间让事务保持打开状态(即使它是单个用户)。
  • 感谢您的评论。我不想让交易保持开放是因为 1) 电源故障不会保留这些更改吗?和 2) 我无法查询未结交易中的更改?

标签: c++ sql c sqlite


【解决方案1】:

这取决于您的应用程序在做什么。如果它只是插入和删除行,您可以轻松地将它们撤消(保留历史表 - 可能最好作为临时表,除非您希望它在运行之间持续存在 - 并驱动您的撤消/重做功能)但是结构变化很多更难撤消,因为 SQLite 只允许在创建表后对其进行非常有限的更改(例如,删除列将需要您复制表并删除旧表)。也就是说,只要您在每次更改后提交,您就可以拥有一个没有用户可见保存操作的应用程序:您只需在每次提交时自动将更改保存到磁盘。

“另存为...”功能会很慢,因为它必然需要将数据复制到一个新文件中,并且即使您使用的是 SSD,也需要花费一些时间来处理多个 GB硬盘驱动器。真的有必要吗?用户可以自己复制数据库文件(SQLite 就是这样),前提是他们当时没有在您的应用程序中打开它。

【讨论】:

  • 感谢您的回复。我正在更新现有表条目(注释字段)并在现有表(标签)上添加和删除行。如果我要保留一个历史表,那意味着我现有的查询将不得不改变,对吧?我希望以某种方式将其推迟到 sqlite ......另外,我认为我应该将“另存为”和自动另存为两个不同的问题分开;我可能会删除“另存为”功能并让用户自己制作副本。但是,我对实现自动保存感兴趣,但没有制作整个 sqlite 文件的完整副本。谢谢。
  • @jobobo 无需保存查询;只是插入和删除。听着,听起来你真正需要做的是停止在细节上摆弄,退一步思考大局的情况。在重新开始之前,先了解正在发生的事情以及你真正想要做的事情。
猜你喜欢
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多