2

我正在 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);
4

2 回答 2

1

您可能应该使用 Qt 的Model View Framework。重要的类有QSqlQueryModel和。为了使您的 UI 与数据库结构隔离,一种合理的方法是为您拥有的特定用例添加视图模型。然后,您可以轻松地将它们链接到基于 Qt Quick 的用户界面。QSqlTableModelQSqlRelationalTableModel

您提出的面向函数的界面并没有什么特别的错误,只是它需要大量无聊的胶水代码才能将其用于用户界面。最好将这种胶水代码作为代理视图模型考虑,因为您正在使用文档化的 API,然后可以很容易地被同事使用。

于 2013-09-04T19:37:26.823 回答
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
}
于 2013-09-04T18:32:01.280 回答