编写SQLite管理器类:可行的方法
Writing an SQLite manager class: viable approach?
我正在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的模型视图框架。其中重要的类别有QSqlQueryModel
、QSqlTableModel
和QSqlRelationalTableModel
。为了使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
}
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 查询SQLite数据库中的日期
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 带内存和隔离功能的SQLite
- 将特定结果集从Oracle数据库复制到C 中的SQLite数据库的最佳方法
- 用sqlite和c++对数据库表进行排序的最佳方法是什么
- 如何在C++的单类方法中获取SQLite记录
- 编写SQLite管理器类:可行的方法
- 初始化SQLite数据库的正确方法是什么?
- 从blob SQLite读取二进制图像并使用OpenCV imdecode解码的最佳方法是什么?