在qt的sqlite数据库编程中,需要先在工程文件添加:
QT += core gui sql
在工程头文件中添加对应qtsql头文件,声明QSqlDatabase类对象,以及自定义的数据库初始化接口DbInit。
#include <QtSql> QSqlDatabase db;
bool DbInit();
还有一些数据库操作的槽函数: private slots:
void GetDbRecord();
void AddRecord();
void EditRecord();
void DelRecord();
void on_tableWidget_itemClicked(QTableWidgetItem *item);
在工程实现文件,我们这里通过列表框QTabWidget来做数据库的用户界面操作:
//QTableWidget中去掉默认自带的行号
QHeaderView* headerView = ui->tableWidget->verticalHeader();
headerView->setHidden(true);
bool MainWindow::DbInit()
{
db = QSqlDatabase::addDatabase("QSQLITE");//使用sqlite数据库驱动类型
db.setDatabaseName("F:\\工具包\\sqlite\\test.db");//加载要使用的sqlite数据库文件
if(!db.open())//打开数据库
return false;
QStringList strTableList=db.tables();//返回数据库中的所有表
if(strTableList.count()<1)
return false;
QString strData,strField;
strTableName=strTableList.at(0);//默认提取第一个表
QSqlQuery query;//使用QSqlQuery类对象进行查询
query.exec("SELECT * FROM "+strTableName);
int index,fieldCount = query.record().count();//获取列数目
ui->tableWidget->setColumnCount(fieldCount);//设置tablewidget列数目
for(index=0;index<fieldCount;index++)
{
//把数据表里每一列的字段名添加到tablewidget
QTableWidgetItem *newItem = new QTableWidgetItem(query.record().fieldName(index));
ui->tableWidget->setHorizontalHeaderItem(index,newItem);//依次设置列表框的头部节点
}
return true;
}
void MainWindow::GetDbRecord()
{
QString strData;
QSqlQuery query;
query.exec("SELECT * FROM "+strTableName);
int rindex=0;
int index,fieldCount = query.record().count();//获取列数目
// 清空列表框中之前的所有数据,先用setRowCount设为0,再用clearContents清除。
ui->tableWidget->setRowCount(0);
ui->tableWidget->clearContents();
//依次向后检索记录,在执行select查询之后,获取的是第一行记录
while(query.next())
{
//在tablewidget新增一行
ui->tableWidget->insertRow(rindex);
for(index=0;index<fieldCount;index++)
{
//依次获取表中每一行记录中每一列的值
strData = query.value(index).toString();
//再赋值到tablewidget中的对应位置
QTableWidgetItem *newItem = new QTableWidgetItem(strData);
ui->tableWidget->setItem(rindex, index, newItem);
}
//累加行数,当next向后检索不到记录时,即为记录的总行数
rindex++;
}
}
void MainWindow::AddRecord()
{
QSqlQuery query;
QString strSql,strName,strAge,strClass;
strName=ui->lineEditName->text();
strClass=ui->lineEditClass->text();
strAge=ui->lineEditAge->text();
//bool QSqlQuery::exec(const QString &query)
//exec第一种重载方式:直接格式化sql语句,填充每个字段的值
strSql="INSERT INTO "+strTableName+"(name,age,class)"+
" VALUES (\'"+strName+"\',"+strAge+",\'"+strClass+"\')";
if(query.exec(strSql))//执行格式化好的sql语句,传递qstring类型的sql语句。
GetDbRecord();
//bool QSqlQuery::exec()
/*//exec第二种重载方式:使用prepare方法准备要格式化的sql语句,使用位置占位符问号,后面通过addBindValue方法依次绑定每个值
query.prepare("INSERT INTO "+strTableName+"(name,age,class)"+
" VALUES (?,?,?)");
query.addBindValue(ui->lineEditName->text());
query.addBindValue(ui->lineEditAge->text().toUInt());
query.addBindValue(ui->lineEditClass->text());
if(query.exec())//执行先前准备的SQL查询,这里exec是空参数。
GetDbRecord();
*/
else
QMessageBox::information(this,"提示","添加失败");
}
void MainWindow::EditRecord()
{
QSqlQuery query;
QString strID,strName,strAge,strClass;
strID=ui->lineEditID->text();
strName=ui->lineEditName->text();
strClass=ui->lineEditClass->text();
strAge=ui->lineEditAge->text();
query.prepare("update "+strTableName+" set name=?,age=?,class=? where id=?");
query.addBindValue(strName);
query.addBindValue(strAge.toUInt());
query.addBindValue(strClass);
query.addBindValue(strID.toUInt());
if(query.exec())//执行先前准备的SQL查询,这里exec是空参数。
GetDbRecord();
else
QMessageBox::information(this,"提示","编辑失败");
}
void MainWindow::DelRecord()
{
QSqlQuery query;
QString strID;
strID=ui->lineEditID->text();
query.prepare("delete from "+strTableName+" where id=?");
query.addBindValue(strID.toUInt());
if(query.exec())//执行先前准备的SQL查询,这里exec是空参数。
GetDbRecord();
else
QMessageBox::information(this,"提示","删除失败");
}
void MainWindow::on_tableWidget_itemClicked(QTableWidgetItem *item)
{//列表框单击时,在对应编辑框里显示每个单元格值
ui->lineEditID->setText(ui->tableWidget->item(item->row(),0)->text());
ui->lineEditName->setText(ui->tableWidget->item(item->row(),1)->text());
ui->lineEditAge->setText(ui->tableWidget->item(item->row(),2)->text());
ui->lineEditClass->setText(ui->tableWidget->item(item->row(),3)->text());
}