编写SQLite管理器类:可行的方法

Writing an SQLite manager class: viable approach?

本文关键字:方法 SQLite 管理器 编写      更新时间:2023-10-16

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

您可能应该使用Qt的模型视图框架。其中重要的类别有QSqlQueryModelQSqlTableModelQSqlRelationalTableModel。为了使UI与数据库结构隔离,一种合理的方法是为您所拥有的特定用例添加视图模型。然后你可以很容易地将这些链接到,比如说,一个基于Qt Quick的用户界面。

您提出的面向函数的界面并没有什么特别的问题,只是它需要大量无聊的粘合代码才能用于用户界面。最好将这种粘合代码作为代理视图模型,因为您正在使用一个文档化的API,这样同事就可以很容易地使用它。

我在某个地方看到了一个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
}