# XSQL **Repository Path**: YYMDXW/xsql ## Basic Information - **Project Name**: XSQL - **Description**: qt下简单封装sqlite。 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2023-02-03 - **Last Updated**: 2024-06-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: Sqlite, Qt ## README #### Qt下的sqlite封装 ```C++ ///说明文件 /******************************************* * 1、打开数据库 * 2、关闭数据库 * ******************************************* * 3、创建表格 * 列表格式(表名,{表头[X] 类型},{表头[X] 类型}……) * "KEY"默认为创建自增主键,表头id * 4、重命名表格 * 5、删除表格 * 6、表格添加新列 * QString new_column 为{表头[X] 类型} * ******************************************* * 7、插入新行 * 列表格式(表名,{表头[X],数值},{表头[X],数值}……) * 8、更新某行 * 列表格式(表名,{表头[X],数值},{表头[X],数值}……,{表头[Y],数值}) * 9、删除某行 * 列表格式(表名,ID表头,ID) * ******************************************* * 10、重命名ID * 列表格式(表名,ID表头,旧ID,新ID) * 11、获取某一行 * 列表格式(表名,{表头[X],表头[X],表头[X]……},{ID表头,ID[Y]}) * 返回X和Y对应的值 * 12、获取最大ID * 13、获取最小ID * *******************************************/ ``` 基于Qt做桌面应用时sqlite存储数据是一个不错的选择。 我需要的功能不多,但是每次编写新的程序时都要重新编写sql代码确实不太方便,于是进行封装。 Qt里使用sqlite直接在pro文件里添加“sql”即可。 ```C++ QT += core gui sql ``` **需要三个相关的类** ```C++ #include #include #include ``` **有这些函数** ```C++ //数据库开关 bool open(QSqlDatabase &data, QString path, QString connect); bool close(QSqlDatabase &data); //表格操作 bool create_table(QSqlDatabase &data, QList list); bool rename_table(QSqlDatabase &data, QString old_name, QString new_name); bool delete_table(QSqlDatabase &data, QString name); //列操作 bool add_column(QSqlDatabase &data, QString table_name, QString new_column); //行操作 bool insert_row(QSqlDatabase &data, QList list); bool update_row(QSqlDatabase &data, QList list); bool delete_row(QSqlDatabase &data, QList list); //行列操作 bool rename_id(QSqlDatabase &data, QList list); //获取数据 QList get_row(QSqlDatabase &data, QList list); //其他 int get_max_id(QSqlDatabase &data, QString table_name); int get_min_id(QSqlDatabase &data, QString table_name); ``` 因为自己的需求,我都是传入QSqlDatabase和数据库连接一起用,所以每个函数都加上了QSqlDatabase &data。如果操作的文件不多,维度不复杂,可直接使用一个QSqlDatabase实例再加上数据库连接即可,操作如下: ```C++ QSqlDatabase first = QSqlDatabase::database("first"); QSqlDatabase second = QSqlDatabase::database("second"); //操作first或者second ``` 经测试,一个QSqlDatabase实例可以创建多个连接,打开多个数据库文件,但是一个实例仅仅只是用“removeDatabase(connection_name);”去除某个连接,再重新使用该连接时会报错,必须要将实例置空“data = QSqlDatabase();”才可以使用之前使用过的连接。这会导致之前所有的该实例的连接不可用。 我需要使用一个连接打开同个类型的多个数据库文件,在不同数据库之间切换,所以在open()函数打开之前会先调用close()函数,不需要可以去除。 ```C++ if(close(data)) qDebug() << "去除旧连接"<< connect; ``` #### 函数介绍 ##### 1、打开数据库 ```C++ bool XSQL::open(QSqlDatabase &data, QString path, QString connect) ``` 主要是传入数据库所在文件地址以及连接名,返回是否打开成功。 ##### 2、关闭数据库 ```C++ bool XSQL::close(QSqlDatabase &data) ``` 如果数据库是打开的话,获取连接名,关闭,置空,去除连连接名。 ##### 3、创建表格 ```C++ bool XSQL::create_table(QSqlDatabase &data, QList list) ``` 创建表格,最主要的点是传入列表的形式。 ```C++ //列表格式(表名,{表头[X] 类型},{表头[X] 类型}……) //"KEY"默认为创建自增主键,表头id ``` 示例代码及创建的表如下: ```C++ QSqlDatabase data; QString path = QApplication::applicationDirPath()+ "/test.data"; QList list = {"test_tabel", "KEY", "A INT", "B TEXT NO NULL", "C TEXT"}; xsql->open(data, path, "first"); xsql->create_table(data, list); ``` ![image-20230203200830761](README.assets/image-20230203200830761.png) ![image-20230203201208861](README.assets/image-20230203201208861.png) ##### 4、重命名表格 ```C++ bool XSQL::rename_table(QSqlDatabase &data, QString old_name, QString new_name) ``` 没有列表一目了然。 示例代码: ```C++ QSqlDatabase data; QString path = QApplication::applicationDirPath()+ "/test.data"; xsql->open(data, path, "first"); xsql->rename_table(data, "test_tabel", "test"); ``` ![image-20230203201948839](README.assets/image-20230203201948839.png) ##### 5、删除表格 ```C++ bool XSQL::delete_table(QSqlDatabase &data, QString name) ``` 这个更简单。 示例代码,接之前的: ```C++ QSqlDatabase data; QString path = QApplication::applicationDirPath()+ "/test.data"; QList list = {"test_1", "KEY", "A INT", "B TEXT NO NULL", "C TEXT"}; QList list_2 = {"test_2", "KEY", "A11 INT", "B11 TEXT NO NULL", "C11 TEXT", "D11 INT", "M11 INT"}; xsql->open(data, path, "first"); xsql->create_table(data, list); xsql->create_table(data, list_2); xsql->rename_table(data, "test_1", "test_rename"); xsql->delete_table(data, "test"); ``` ![image-20230203202807499](README.assets/image-20230203202807499.png) ##### 6、表格添加列 ```C++ bool XSQL::add_column(QSqlDatabase &data, QString table_name, QString new_column) ``` 注意QString new_column 为{表头[X] 类型},和之前创建表格一样。 示例代码: ```C++ QSqlDatabase data; QString path = QApplication::applicationDirPath()+ "/test.data"; xsql->open(data, path, "first"); xsql->add_column(data, "test_2", "GGGGGGG TEXT"); xsql->add_column(data, "test_rename", "GGGGGGG TEXT"); }); ``` ![image-20230203203716261](README.assets/image-20230203203716261.png) ![image-20230203203719248](README.assets/image-20230203203719248.png) ##### 7、插入新行 ```C++ bool XSQL::insert_row(QSqlDatabase &data, QList list) ``` 需要注意的只有列表的格式,表名和表头都是QString,数值可以是数据库支持的类型。 ```C++ //列表格式(表名,{表头[X],数值},{表头[X],数值}……) ``` 示例代码: ```C++ QDateTime time = QDateTime::currentDateTime(); QString path = QApplication::applicationDirPath()+ "/test.data"; QList list = {"DF", "KEY", "A INT", "B TEXT", "C DATETIME"}; QList list_ = {"DF", "A", 4545, "B", "buvidc", "C", time}; xsql->open(data, path, "first"); xsql->create_table(data, list); xsql->insert_row(data, list_); ``` ![image-20230208173100819](README.assets/image-20230208173100819.png) ##### 8、更新某行 ```C++ bool XSQL::update_row(QSqlDatabase &data, QList list) ``` 列表格式: ```C++ //列表格式(表名,{表头[X],数值},{表头[X],数值}……,{表头[Y],数值}) ``` 示例代码: ```C++ QDateTime time = QDateTime::currentDateTime(); QString path = QApplication::applicationDirPath()+ "/test.data"; xsql->open(data, path, "first"); QList list = { "DF", "A", 88888888, "B", "测试", "C", time, "id", 3}; xsql->update_row(data, list); QList list2 = {"DF", "A", 76776, "B", "测试", "id", 5}; xsql->update_row(data, list2); ``` ![image-20230208174230179](README.assets/image-20230208174230179.png) ##### 9、删除某行 ```C++ bool XSQL::delete_row(QSqlDatabase &data, QList list) ``` 列表格式: ```C++ //列表格式(表名,ID表头,ID) ``` 示例代码: ```C++ QString path = QApplication::applicationDirPath()+ "/test.data"; xsql->open(data, path, "first"); QList list = {"DF", "id", 2}; xsql->delete_row(data, list); QList list2 = {"DF", "id", 4}; xsql->delete_row(data, list2); ``` ![image-20230208174856173](README.assets/image-20230208174856173.png) ##### 10、重命名ID ```C++ bool XSQL::rename_id(QSqlDatabase &data, QList list) ``` 列表格式: ```C++ //列表格式(表名,ID表头,旧ID,新ID) ``` 示例代码: ```C++ QString path = QApplication::applicationDirPath()+ "/test.data"; xsql->open(data, path, "first"); QList list = {"DF", "id", 3, 2}; xsql->rename_id(data, list); QList list2 = {"DF", "id", 5, 3}; xsql->rename_id(data, list2); ``` ![image-20230208175553206](README.assets/image-20230208175553206.png) ##### 11、获取某一行 ```C++ QList XSQL::get_row(QSqlDatabase &data, QList list) ``` 列表格式: ```C++ //列表格式(表名,{表头[X],表头[X],表头[X]……},{ID表头,ID[Y]}) ``` 示例代码: ```C++ QString path = QApplication::applicationDirPath()+ "/test.data"; xsql->open(data, path, "first"); QList list = {"DF", "id", "B", "A", "id", 2}; QList list_ = xsql->get_row(data, list); QList list2 = {"DF", "A", "C", "C", "id", 3}; QList list2_ = xsql->get_row(data, list2); qDebug() << list_<< "\n" << list2_ ; ``` ![image-20230208190910041](README.assets/image-20230208190910041.png) ![image-20230208190920946](README.assets/image-20230208190920946.png) ##### 12、获取最大最小ID ```C++ int XSQL::get_max_id(QSqlDatabase &data, QString table_name) int XSQL::get_min_id(QSqlDatabase &data, QString table_name) ``` 示例代码: ```C++ QString path = QApplication::applicationDirPath()+ "/test.data"; xsql->open(data, path, "first"); int max = xsql->get_max_id(data,"DF"); int min = xsql->get_min_id(data,"DF"); qDebug() << min <