我正在Qt框架中学习SQLite和C ++。作为一个学习项目,我正在做一个简单的图像查看器,使用户能够使用关键字,类别,注释和ROI标记图像(对于一些后来的OpenCV功能)。这是一个非常简单的数据库,包含一些主表和一些关系表。
我认为我已经掌握了基础知识并且早期测试表明我的记录数据正在存储但是在编写管理数据库的方法时,我看起来最终将采用很多方法,特别是当我开始添加搜索,排序,删除等。
这让我想问我是否正确的方式。我可以看到我的一些查询逻辑(用于搜索,排序)可能最好是在另一个“控制器”类型类中,并且所有这个管理器类需要做的是处理基本的创建和删除任务,并且只返回一个查询对象以响应以字符串形式传入的SELECT语句。
那么,我是否以合理的方式解决这个问题?
到目前为止经理方法:
bool openDatabase(QString name);
void closeDatabase();
bool createTables();
bool addKeyword(QString keyword);
bool addCategory(QString category);
bool deleteKeyword(QString keyword);
bool deleteCategory(QString category);
bool addROI(int x, int y, int width, int height);
bool deleteROI(int id);
bool addImage(QString name, QString path, QByteArray image, QByteArray thumb);
答案 0 :(得分:1)
你可能应该使用Qt的Model View Framework。重要的课程有QSqlQueryModel
,QSqlTableModel
和QSqlRelationalTableModel
。为了使您的UI与数据库结构隔离,合理的方法是为您拥有的特定用例添加view models。然后,您可以轻松地将这些链接到基于Qt Quick的用户界面。
您提出的面向功能的界面没有什么特别的错误,除了它需要大量无聊的胶水代码才能将其用于用户界面。最好将这样的粘合代码视为代理视图模型,因为您正在使用一个可以由同事轻松获取的文档化API。
答案 1 :(得分:0)
我在某个地方看到了一个DatabaseManager
类并对其进行了修改。这是插入函数:
bool DatabaseManager::insert(const QString &tableName, const QString& columns, const QString &value)
{
bool ret = false;
if(db.isOpen()){
QSqlQuery query;
ret = query.exec( QString("INSERT INTO %1 (%2) VALUES(%3)").arg(tableName, columns, value) );
}
return ret;
}
您可以为其提供表格的名称,要填写的列,然后是值。这是我称之为的一个例子:
if( !dm.insert("Product", "ID, Name, Price, Notes, Category",
"'1', 'A DVD','10€', 'Some Notes', 'DVD'") )
{
//Note that each value is surrounded by an apostrophe
//Now whatever you want to
}