我有一个Firefox插件,它使用SQLite DB存储数据(借助于mozIStorageConnection的包装.Addon有一个选项窗口,用于操作大多数附加数据。
用户要求添加机会取消他们在该窗口中所做的更改。为了在DB中为数据实现这一点,我使用了窗口的“load”事件处理程序,如下所示:
window.addEventListener('load', function() {
//...
// conn is mozIStorageConnection instance.
conn.beginTransaction();
document.documentElement.addEventListener('dialogaccept', function(){
conn.commitTransaction();
}, false);
document.documentElement.addEventListener('dialogcancel', function(){
conn.rollbackTransaction();
}, false);
};
目标是在窗口关闭时使用“确定”按钮提交对数据库的更改,并在使用“取消”按钮关闭窗口时将其回滚。
我的插件使用JS代码模块为所有FF窗口使用单个背景上下文。因此,可以使用其他FF窗口来使用插件并对其数据进行一些更改。 FF窗口中内置了其他UI元素,其中包含用于修改插件数据的叠加层。但是当我在选项窗口中使用提交/回滚方案时,它也会影响使用加载项UI的其他元素所做的更改。
理想的解决方案是与DB建立两个独立的连接。其中一个将由负责选项窗口更改的模块使用,此连接的操作可以取消。另一个将处理在不会回滚的覆盖元素中进行的修改。但SQLite不支持多个编写器,因此这种方法不起作用。
是否可以实现我想要实现的功能?我需要能够为所有操作使用相同的DB,但其中一些(在选项窗口中发生的那些)应该是可取消的。