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
原文地址:https://www.cnblogs.com/gisk/p/qt_sqlite.html