我正在编写一个数据库访问应用程序来存储一些数据,并想问一些关于模型/视图体系结构的问题。
(使用:Qt 4.7.4,自己构建;PostgreSQL 9.0;目标:WinXP,Win7(32/64位))
首先让我解释一下我正在努力实现的目标和目前的处境。
我有两个页面(在QStackedWidget中插入子类QWidgets),其中一个QTableView绑定到一个模型。每个视图都绑定到PostgreSQL服务器中的一个表。您可以添加/编辑/删除/排序/筛选项目。
每个页面只能由一种类型的用户看到,让我们调用角色Role1和Role2。
所有与模型相关的提交策略都是手动提交的。
(事务隔离级别=可序列化。)当两个用户要编辑(例如)同一行时,我要执行“选择…”。。。FOR UPDATE“查询-确保当某人编辑某个内容时,他会将其更改与新的更改合并(如果有,就像在SVN中那样)。但我只看到一个submitAll()方法QSqlTableModel。
可能捕获beforeUpdate()、beforeDelete()、beforeInsert()信号并手动执行“选择。。。“更新”是一个选项。
另一种方法是将QSqlTableModel子类化。实现这一目标的干净而美好的方法是什么?
我想定期更新每个页面的QSqlTableView(最多可以看到一个页面,Role1用户只能访问Page1,Role2=>Page2也一样)。
我首先想到的是使用QTimer并手动调用QSqlTableModel的select(),但是。。。不知道这是不是很酷的方法。
我还想定期检查与数据库的连接是否正常,但我认为QTimer+QSqlDatabase::isOpen()可以。
现在,这两个表具有相同的主键,有些列是相同的。我希望当Role1用户更改Table1中的行时,自动更改Table2的相应列,反之亦然。我应该在Postgres中创建触发器吗?
顺便说一句,数据库很小——两个表中的每一个表大约有3-4000行,大约有10列(主要是varchar,1个文本和2个日期列)。
谢谢你的阅读和新年快乐!:)
最佳答案
我认为你应该考虑做以下事情:
我将自己的模型实现为QSqlTableModel
的子类,而不是使用QAbstractTableModel
作为模型。这将允许您对数据操作方面的操作进行大量控制。
这将需要的一件事是,对于表中的某些字段,您需要实现QAbstractItemDelegate
的子类,该子类将允许修改表中的数据,因为我非常确定您不希望允许用户更新表中的任何字段,例如primary key
可能必须单独存在。
对于问题2,我建议为每一行实现一个名为transaction_counter
的字段,这样您就不必select
表中的每一行,只需更新一行,transaction_counter
将在每一行更新时更新,而新的一行将插入到新的行插入中。需要做的一件事是计数器在整个表中是唯一的。例如,如果表的初始状态为:row1 has counter = 0 and row2 has counter = 0
。如果row1
被更新,则设置为counter
。当1
被再次更新时,它被设置为row1
。当counter
现在被更新时,它被设置为2
等。您当然可以使用row2
现在刷新数据,这将更有利于例如检查数据,因为一个用户可能正在更新与具有相同角色的另一个用户相同的表。
对于问题3。我看不出为什么不自定义模型的任何原因,特别是如果您决定将数据与模型分离,您可以从它的显示中单独操作数据。有点实现。每一个都可以单独维护,只要您有一个代表的反馈机制。
关于问题4。答案是肯定的,或者您可以在应用程序中实现触发器。
希望这有帮助。新年快乐!
关于qt - Qt:QSqlTableModel + QTableView与PostgreSQL同步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8679975/