近距离接触SQLite发现有很多不错的特性,最主要的是免安装、单文件,对于一般的管理系统和信息索引来说很合适,之前在.net中使用过SQLServer,所以SQLite很好接触,SQL是数据库通用语言,所以尝试着在Qt-Sqlite环境下做了简单的增删改查(CRUD)。
在使用过程中,需要以下几点说明:
1)需要在Qt Modules中引入“SQL”模块;
2)一个database对应一个文件,可以包含多张表(table);
3)database必须打开(open)和关闭(close),这一步可以选择分别在构造函数和析构函数中进行(QDataBase变量是成员变量),但不是必须;
4)建议使用QTableView显示数据,不仅考虑到其Model可以方便的装载数据库,还要借用其自带的过滤条件函数,可以进行类似数据库中的查询操作。
1.数据库初始化
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
2.创建表操作
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
3.Insert数据
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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();
4.Update数据
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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();
5.Query数据
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
6.Delete数据
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
7.Show数据
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }