• Qt使用SQLite


      近距离接触SQLite发现有很多不错的特性,最主要的是免安装、单文件,对于一般的管理系统和信息索引来说很合适,之前在.net中使用过SQLServer,所以SQLite很好接触,SQL是数据库通用语言,所以尝试着在Qt-Sqlite环境下做了简单的增删改查(CRUD)。

      在使用过程中,需要以下几点说明:

      1)需要在Qt Modules中引入“SQL”模块;

      2)一个database对应一个文件,可以包含多张表(table);

      3)database必须打开(open)和关闭(close),这一步可以选择分别在构造函数和析构函数中进行(QDataBase变量是成员变量),但不是必须;

      4)建议使用QTableView显示数据,不仅考虑到其Model可以方便的装载数据库,还要借用其自带的过滤条件函数,可以进行类似数据库中的查询操作。

      1.数据库初始化

      
     1 database=QSqlDatabase::addDatabase("QSQLITE");    //使用SQLite的情况下,参数必须是“QSQLITE”大小写敏感
     2 
     3     database.setDatabaseName("newbase.db");    //这个参数是数据库文件的路径,如"D:/newbase.db",如果该数据库文件已存在则使用原数据库。
     4     //db.setDatabaseName(":memory:"); //这样就把生成的数据库文件是在内存当中的,在工程文件目录下找不到
     5     if (!database.open())
     6     {
     7         QMessageBox::critical(this,"Error","cannot open database!");
     8         return;
     9     }
    10     
    11     
    12 
    13     if (QFile::exists("newbase.db"))
    14     {
    15         //QFile::remove("newbase.db");
    16         showData();
    17         return;
    18     }
    database

      

      2.创建表操作 

      
     1         QString strCreateTable="Create table Student(Id INTEGER Primary Key, Name nvarchar(30) not null, Age int)";
     2 
     3     QSqlQuery sql_query;
     4     
     5     if (!sql_query.exec(strCreateTable))
     6     {
     7         QMessageBox::critical(this,"Error",sql_query.lastError().text());
     8         QMessageBox::critical(this,"Error","cannot create Student table!");
     9         return;
    10     }    
    CreateTable

      

      3.Insert数据

      
    1         QSqlQuery sql_query;
    2     strAdd=QString("Insert into Student values(NULL,'%1',%2)").arg(ui.txtAdd_Name->text()).arg(ui.txtAdd_Age->text().toInt());
    3     if (!sql_query.exec(strAdd))
    4     {
    5         QMessageBox::critical(this,"Error",sql_query.lastError().text());
    6         return;
    7     }
    8     showData();
    InsertData

      

      4.Update数据

      
    1     QSqlQuery sql_query;
    2     strUpdate=QString("Update Student set Name='%1',Age=%2 where Id=%3").arg(ui.txtUpdate_Name->text()).arg(ui.txtUpdate_Age->text()).arg(ui.txtUpdate_Id->text());
    3     if (!sql_query.exec(strUpdate))
    4     {
    5         QMessageBox::critical(this,"Error",sql_query.lastError().text());
    6         return;
    7     }
    8     showData();
    UpdateData

      5.Query数据

      
     1 void CRUD::btnQueryClick()
     2 {
     3     QString strId=ui.txtQuery_Id->text().trimmed();
     4     QString strName=ui.txtQuery_Name->text().trimmed();
     5     QString strAge=ui.txtQuery_Age->text().trimmed();
     6     QList<QString> wheres;
     7     QSqlQuery sql_query;
     8 
     9     bool ok;
    10     strId.toInt(&ok);
    11     if (!strId.isEmpty()&&ok)
    12     {
    13         wheres.append("Id="+strId);
    14     }
    15     if (!strName.isEmpty())
    16     {
    17         wheres.append("Name like '%"+strName+"%'");
    18     }
    19     if (!strAge.isEmpty())
    20     {
    21         wheres.append("Age="+strName);
    22     }
    23     if (wheres.count()<=0)
    24     {
    25         QMessageBox::warning(this,"warning","There are no conditions");
    26         //showData();
    27         return;
    28     }
    29     
    30     QString strTmp=wheres[0];
    31     for (int i=1;i<wheres.count();i++)
    32     {
    33         strTmp=strTmp+" and "+wheres[i];
    34     }
    35     strQuery="Select * from Student where "+strTmp;
    36 
    37     //从数据库中查询
    38     if (!sql_query.exec(strQuery))
    39     {
    40         QMessageBox::critical(this,"Error",sql_query.lastError().text());
    41         return;
    42     }
    43 
    44     //从显示的QTableView中过滤
    45     QSqlTableModel *sql_model=new QSqlTableModel(this);
    46     sql_model->setTable("Student");    //设置数据库中的表
    47     sql_model->setEditStrategy(QSqlTableModel::OnManualSubmit);    //设置保存策略为手动提交
    48     sql_model->setFilter(strTmp);    //Filter就是Where后面的条件
    49     sql_model->select();    //选取部分数据
    50     ui.tableView->setModel(sql_model);    //这个只是从显示上进行控制,想要获取真正的数据有两种方法:从QTableView中获取;执行下面的SQL查询。
    51 
    52 
    53     /*QStandardItemModel *model = new QStandardItemModel(this); 
    54     
    55     if (!sql_query.exec(strQuery))
    56     {
    57         QMessageBox::critical(this,"Error",sql_query.lastError().text());
    58         return;
    59     }
    60     
    61     for (int i=0;sql_query.next();i++)
    62     {
    63         
    64         model->setItem(i,0,&QStandardItem(sql_query.value("Id").toString()));
    65         model->setItem(i,1,&QStandardItem(sql_query.value("Name").toString()));
    66         model->setItem(i,2,&QStandardItem(sql_query.value("Age").toString()));
    67     }
    68 
    69     
    70     ui.tableView->setModel(model);*/
    71     //showData();
    72     
    73 }
    QueryData

      6.Delete数据

      
     1 void CRUD::btnDeleteClick()
     2 {
     3     QSqlQuery sql_delete;
     4     QString strId=ui.txtDelete_Id->text().trimmed();
     5     bool ok;
     6     strId.toInt(&ok);
     7     if (strId.isEmpty()||!ok)
     8     {
     9         QMessageBox::critical(this,"Error","Please input Id correctly");
    10         return;
    11     }
    12     strDelete=QString("Delete from Student where Id=%1").arg(strId);
    13     if (!sql_delete.exec(strDelete))
    14     {
    15         QMessageBox::critical(this,"Error",sql_delete.lastError().text());
    16         return;
    17     }
    18     showData();
    19 }
    DeleteData

      7.Show数据

      
    1 void CRUD::showData()
    2 {
    3     QSqlTableModel *sql_model=new QSqlTableModel(this);
    4     sql_model->setTable("Student");    //设置数据库中的表
    5     sql_model->setEditStrategy(QSqlTableModel::OnManualSubmit);    //设置保存策略为手动提交
    6     sql_model->select();    //选取所有数据
    7     ui.tableView->setModel(sql_model);
    8 }
    ShowData
  • 相关阅读:
    线段树练习两题
    DP+单调队列 codevs 1748 瑰丽华尔兹(还不是很懂具体的代码实现)
    线段树和树状数组问题补充
    一些常见的优化:读入优化,滚动数组
    单调队列应用--BZOJ 3831 Little Bird
    单调队列练习之广告印刷
    详解--单调队列 经典滑动窗口问题
    数据结构--栈 codevs 1107 等价表达式
    离散化+线段树 POJ 3277 City Horizon
    求次短路 codevs 1269 匈牙利游戏
  • 原文地址:https://www.cnblogs.com/gisk/p/qt_sqlite.html
Copyright © 2020-2023  润新知