Qt下Sqlite数据库操作

泄露秘密 提交于 2020-10-02 10:35:38

 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 路径下将文件解压(路径可自己定义);

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

 

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

(4)数据库操作

    1>创建或打开数据库

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

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

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

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

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

sql语句:

 

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

 

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

.tables

.schema

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();
}































 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!