Sqlite数据库作为Qt项目开发中经常使用的一个轻量级的数据库,可以说是兼容性相对比较好的数据库之一(Sqlite就像Qt的亲儿子,如同微软兼容Access数据库一样)。关于Sqlite和Qt的千丝万缕的故事,有机会再说(各位看官查一查也可以自己search一下)。这里简单说说Sqlite数据库的用法吧。

一、sql语句和部分接口函数

1、在.pro文件中记得增加 :

QT       += core gui sql

2、sqlite数据库的增删查改【接口函数参见代码】

1. #ifndef SQLITEDBAOPERATOR_H
2. #define SQLITEDBAOPERATOR_H
3. #include"generalheaders.h"
4. #include <QSqlDatabase>
5. #include <QSqlQuery>
6. #include <QSqlQueryModel>
7. #include <QDebug>
8. #include <QSqlError>
9. class SqliteDBAOperator
10. {
11. public:
12. SqliteDBAOperator();
13. ~SqliteDBAOperator();
14. public:
15. //创建数据库并建立连接
16. bool OpenDb(void);
17. //创建数据表(student)
18. void createTable(void);
19. //在表格中增加新的字段
20. void addNewcolumn(QString &columnNameAndproperty);
21. //查询和显示结果
22. void queryTable(QString& str);
23. //判断数据表是否存在
24. bool IsTaBexists(QString& Tabname);
25. //插入数据
26. void singleinsertdata(w2dba &singledb);//插入单条数据
27. void Moreinsertdata(QList<w2dba> &moredb);//插入多条数据
28. //删除数据
29. void deletedata();
30. //修改数据
31. void updatedata();
32. //关闭数据库
33. void closeDb(void);
34. private:
35. QSqlDatabase db;//用于建立和数据库的连接
36. };
37.  
38. #endif // SQLITEDBAOPERATOR_H

这里w2dba 是自己定义的一个结构体类型的数据。各位可以根据自己实际需要修改。 因为c++开发面向对象的思想,所以我个人通常是在确定一个对象后,再思考这个对象的衣食住行、拉屎放屁、能够公开交流的、或者只能私有的都有哪些东西,接着根据这个对象的应有的特点,编写对应的函数尽量让这个对象鲜活饱满,但是春光不会外泄出来(==》纯属小弟个人微不足道的理解,不喜勿喷。更多精彩画面,自行脑补)。

 

/*构造函数中初始化数据库对象,并创建连接*/
/*构造函数中初始化数据库对象,并创建连接*/
1. /*Sqlite数据库操作*/
2.  
3. #include "sqlitedbaoperator.h"
4. #include"generalheaders.h"
1. SqliteDBAOperator::SqliteDBAOperator()
2. {
3. QSqlDatabase database;
4. if (QSqlDatabase::contains("qt_sql_default_connection"))
5. {
6. database = QSqlDatabase::database("qt_sql_default_connection");
7. }
8. else
9. {
10. //建立和sqlite数据的连接
11. db = QSqlDatabase::addDatabase("QSQLITE");
12. //设置数据库文件的名字
13. QString dbname = QDir::currentPath() +QString("/")+ QString("MACAddrs.db");
14. db.setDatabaseName(dbname);
15. }
16. }

1. /*析构函数关闭数据库连接*/
2. SqliteDBAOperator::~SqliteDBAOperator()
3. {
4. db.close();
5. }
6.  
7. //打开数据库
8. bool SqliteDBAOperator::OpenDb(void)
9. {
10. //打开数据库
11. if(db.open() == false){
12. qDebug() << "连接数据失败!";
13. return false;
14. }
15. qDebug() << "连接数据库成功";
16. return true;
17. }
18.  
19. //判断数据库中某个数据表是否存在
20. bool SqliteDBAOperator::IsTaBexists(QString& Tabname)
21. {
22. QSqlDatabase db = QSqlDatabase::database();
23. if(db.tables().contains(Tabname))
24. {
25. return true;
26. }
27. return false;
28. }
29.  
30.  
31. //创建数据表
32. void SqliteDBAOperator::createTable(void)
33. {
34. //用于执行sql语句的对象
35. QSqlQuery query;
36. //构建创建数据库的sql语句字符串
37. QString str = QString("CREATE TABLE MACAddrs (\
38. ID INT PRIMARY KEY NOT NULL,\
39. Type TEXT NOT NULL,\
40. ProduceTime TEXT NOT NULL)");
41. //执行sql语句
42. query.exec(str);
43. }
44.  
45. void SqliteDBAOperator::addNewcolumn(QString& columnNameAndproperty)
46. {
47. }
48.  
49. //查询和显示结果
50. void SqliteDBAOperator::queryTable(QString& str)
51. {
52. QSqlQuery query;
53. //构建创建数据库的sql语句字符串
54. str = QString("SELECT ID,Type,MACADDR FROM MACAddrs");
55. //执行sql语句,并将结果集保存到model
56. query.exec(str);
57. }
58.  
59.  
60. //单条插入
61. void SqliteDBAOperator::singleinsertdata(w2dba &singledb)
62. {
63. QSqlQuery query;
64. query.prepare("INSERT INTO MACAddrs VALUES (:ID,:Type,:ProduceTime)");
65. query.bindValue(":ID", singledb.id);
66. query.bindValue(":Type", singledb.type);
67. query.bindValue(":ProduceTime",singledb.prodceTime);
68. query.exec();
69. }
70.  
71. //多条插入
72. void SqliteDBAOperator::Moreinsertdata(QList<w2dba>& moredb)
73. {
74. QSqlQuery query;
75. query.prepare("insert into MACAddrs values (?,?,?,?,?,?,?,?)");
76. QVariantList idlist,snlist,typelist,MACAddrlsit,produceTimelist,Pieceslist,Operatorlist,OperateStatlist;
77. for(int i=0; i< moredb.size(); i++)
78. {
79. idlist << moredb.at(i).id;
80. typelist << moredb.at(i).type;
81. produceTimelist << moredb.at(i).prodceTime;
82. }
83. query.addBindValue(idlist);
84. query.addBindValue(MACAddrlsit);
85. query.addBindValue(produceTimelist);
86.  
87. if (!query.execBatch())
88. {
89. qDebug() << query.lastError();
90. }
91. }
92.  
93.  
94. //删除一条数据
95. void SqliteDBAOperator::deletedata()
96. {
97. //比较简单,自行补充
98. }
99. //修改
100. void SqliteDBAOperator::updatedata()
101. {
102. //比较简单,自行补充
103.  
104. }
105.  
106.  
107. void SqliteDBAOperator::closeDb(void)
108. {
109. db.close();
110. }

这部分可能稍微有点意思的就是带参SQL语句的编写,在数据的单条插入和多条插入中,使用了两种不同的方法,各位可以自行查看。

 

二、接口函数的检测

1、windows下sqlite数据库的安装:

   (1) 前往www.sqlite.org.com下载相应的数据库文件,然后在创建路径并在 c:\sqilte3 路径下将文件解压(路径可自己定义);

QT QSqlDatabas mysql备份 备份 qt中数据库_数据库

(2)设置环境变量,将数据库路的路径增加到PATH变量下。

QT QSqlDatabas mysql备份 备份 qt中数据库_数据_02

 

QT QSqlDatabas mysql备份 备份 qt中数据库_数据_03

(3)环境配置完成,重启电脑,配置生效。

(4)数据库操作

    1>创建或打开数据库

QT QSqlDatabas mysql备份 备份 qt中数据库_数据_04

通过cd 命令到.db数据库文件所在的目录下,如果没有文件自己创建一个。

QT QSqlDatabas mysql备份 备份 qt中数据库_#include_05

这里在C盘的根目录下创建一个test.db的数据库文件

QT QSqlDatabas mysql备份 备份 qt中数据库_数据库_06

敲击回车后进入sqlite数据库,显示如下:

QT QSqlDatabas mysql备份 备份 qt中数据库_#include_07

(2)前面简单的数据库基本配置工作已经完成,现在开始数据库的操作部分

首先,我们要创建一张数据表:

sql语句:

 

CREATE TABLE MACAddrs ( ID INT PRIMARY KEY NOT NULL,Type TEXT NOT NULL,ProduceTime TEXT );

QT QSqlDatabas mysql备份 备份 qt中数据库_#include_08

 

查看表格是否创建成功 以及表头内容:

.tables

.schema

QT QSqlDatabas mysql备份 备份 qt中数据库_#include_09

QT实现对sqlite数据库的操作



该程序对数据库的操作包括4个字段:ID、Name、Addr、Nick  (注意第一个字段必须是整数)



query、insert、delete按钮分别表示查询、插入、删除功能


查询按钮的实现:

void database::on_QueryButton_clicked()
 {
     QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
     db.setDatabaseName("test.db");
     bool ok = db.open();
     if (ok == true)
     {
         QSqlQuery query;
         query.exec("SELECT * from info");
         QString string;
         while (query.next())
         {
             QString id = query.value(0).toString();
             qDebug() <            string += id + "\n";
             QString name = query.value(1).toString();
             string += name + "\n";
         }
         qDebug() <        ui->TextEdit->setText(string);
     }
     else
     {
         QMessageBox::information(this, "ERROR", "open database error");
     }
     db.close();
 }


插入按钮的实现:


void database::on_InsertButton_clicked()
 {
     QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
     db.setDatabaseName("test.db");
     bool ok = db.open();
     if (ok == true)
     {
         QSqlQuery query;
         query.prepare("INSERT INTO info (id, name) "
                   "VALUES (:id, :name)");
         query.bindValue(":id", ui->IdEdit->text().toInt());
         query.bindValue(":name", ui->NameEdit->text());
         query.exec();
         ui->IdEdit->clear();
         ui->NameEdit->clear();
         this->on_QueryButton_clicked();
     }
     else
     {
         QMessageBox::information(this, "ERROR", "open database error");
     }
     db.close();
 }


删除按钮的实现:



void database::on_DeleteButton_clicked()
 {
     QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
     db.setDatabaseName("test.db");
     bool ok = db.open();
     if (ok == true)
     {
         QSqlQuery query;
         QString command="DELETE FROM info WHERE ";
         if (ui->IdEdit->text().isEmpty() == false)
         {
             command.append("id="+ui->IdEdit->text());
             query.exec(command);
         }
         else if (ui->NameEdit->text().isEmpty() == false)
         {
             command +="name=\'" + ui->NameEdit->text() + "\'";
             qDebug()<            query.exec(command);
         }
         else
         {
             QMessageBox::information(this, "ERROR", "open database ok! delete error");
         }
         ui->IdEdit->clear();
         ui->NameEdit->clear();
         this->on_QueryButton_clicked();
     }
     else
     {
         QMessageBox::information(this, "ERROR", "open database error");
     }
     db.close();
 }