2012-04-04 82 views
1

我有一个SQLite文件,可以很容易1GB(可能会变成10GB)。我想为我的桌面应用程序(C++)模拟“另存为”和自动保存功能,类似于Office Word。 在我看来,每次我想备份时都要制作整个文件的副本是不切实际的。SQLlite for“另存为”和自动保存功能的大文件

我刚开始调查SAVEPOINT。这是处理这个问题的方法吗?但是我不清楚保存点是否允许我查询我在保存点之间插入的内容,直到我提交/发布。

我将不胜感激反馈。

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

+2

SAVEPOINTS用于交易。所以你可以回滚一部分交易,而不是全部。而且你真的不希望在应用程序使用期间保持事务处于打开状态(即使它是单用户)。 – MatBailie 2012-04-04 08:40:19

+0

感谢您的评论。我是否不想让交易开放,因为1)电力故障不会保留这些更改?和2)我无法查询一个打开的交易内的变化? – jobobo 2012-04-04 18:19:40

回答

2

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

“另存为...”功能将是缓慢的,因为它一定需要将数据复制到一个新的文件,而这需要一些时间与多个GB,即使您使用的是SSD代替HDD的。它真的有必要吗?用户可以自己复制数据库文件(SQLite很好),只要他们没有在你的应用程序中打开它。

+0

感谢您的回应。我正在更新现有表格条目(注释字段)并添加和删除现有表格(标签)上的行。如果我要保留历史记录表,那意味着我现有的查询将不得不改变,对吗?我希望推迟到SQLite莫名其妙... 此外,我想我应该分开“另存为”和自动保存为两个不同的问题;我可能会删除“另存为”功能,并让用户自己复制。但是,我有兴趣实现自动保存,但没有完整复制整个sqlite文件。谢谢。 – jobobo 2012-04-04 18:30:10

+0

@jobobo无需保存查询;只需插入和删除。看,这听起来像你真正需要做的就是停止在细节上摆弄,并退后一步,并考虑到全局的情况。深入了解发生了什么事情以及你真正想要做的是什么,然后再潜入。 – 2012-04-05 12:46:33