1,SQLite数据库操作
2,源码:
#ifndef ITEMDIALOG_H
#define ITEMDIALOG_H
#include <QDialog>
namespace Ui {
class ItemDialog;
}
class ItemDialog : public QDialog
{
Q_OBJECT
public:
explicit ItemDialog(QWidget *parent = 0);
~ItemDialog();
void setData(QStringList strList);
QStringList dataList;
private slots:
void on_okButton_clicked();
void on_cancelButton_clicked();
private:
Ui::ItemDialog *ui;
};
#endif // ITEMDIALOG_H
#include "itemdialog.h"
#include "ui_itemdialog.h"
ItemDialog::ItemDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::ItemDialog)
{
ui->setupUi(this);
}
ItemDialog::~ItemDialog()
{
delete ui;
}
void ItemDialog::setData(QStringList strList)
{
int temp_data = 0;
QString temp_str;
temp_str = strList.at(0);
temp_data = temp_str.toInt();
ui->Id->setValue(temp_data);
ui->Attribute->setText(strList.at(1));
ui->Type->setText(strList.at(2));
ui->Kind->setText(strList.at(3));
ui->Nation->setText(strList.at(4));
ui->Carnumber->setText(strList.at(5));
ui->Elevaltor->setText(strList.at(6));
ui->Distance->setText(strList.at(7));
ui->Oil->setText(strList.at(8));
ui->Temperature->setText(strList.at(9));
}
//添加
void ItemDialog::on_okButton_clicked()
{
dataList.clear();
dataList << QString::number((ui->Id->value()));
dataList << ui->Attribute->text();
dataList << ui->Type->text();
dataList << ui->Kind->text();
dataList << ui->Nation->text();
dataList << ui->Carnumber->text();
dataList << ui->Elevaltor->text();
dataList << ui->Distance->text();
dataList << ui->Oil->text();
dataList << ui->Temperature->text();
QDialog::accept();
}
//取消
void ItemDialog::on_cancelButton_clicked()
{
QDialog::reject();
}
#ifndef TABLEMODEL_H
#define TABLEMODEL_H
#include <QAbstractTableModel>
#include <QObject>
class TableModel : public QAbstractTableModel
{
public:
explicit TableModel(QObject *parent=0);
//下面四个函数是QAbstractTAbleModel类的纯虚函数
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
virtual int columnCount(const QModelIndex &parent = QModelIndex()) const;
QVariant data(const QModelIndex &index, int role) const;
QVariant headerData(int section, Qt::Orientation orientation, int role) const;
void AdditemData(QStringList data, int num);
void ClearitemData();
QStringList getRowData(int row);
void removeRow(int row);
void updateRow(QStringList strlist, int row);
private:
QStringList header;
enum { dataNum = 10};
QStringList Data[dataNum];
int RowNum;
};
#endif // TABLEMODEL_H
#include "tablemodel.h"
TableModel::TableModel(QObject *parent): QAbstractTableModel(parent)
{
RowNum = 0;
header << "Id" << "Attribute" << "Type" << "Kind" << "Nation" << "Carnumber" << "Elevaltor" << "Distance" << "Oil" << "Temperature";
}
//添加数据
void TableModel::AdditemData(QStringList data, int num)
{
for (int j=0; j<num; j++)
{
for (int i=0; i<dataNum; i++)
{
Data[i] << data[i+j*dataNum];
}
RowNum++;
}
endResetModel();
}
//清空数据
void TableModel::ClearitemData()
{
RowNum = 0;
for (int i=0; i<dataNum; i++)
{
Data[i].clear();
}
}
//删除行
void TableModel::removeRow(int row)
{
for(int i=0; i<dataNum; i++)
{
Data[i].removeAt(row);
}
RowNum--;
endResetModel();
}
//更新行数据
void TableModel::updateRow(QStringList strlist, int row)
{
for(int i=0; i<dataNum; i++)
{
Data[i].replace(row, strlist.at(i));
}
endResetModel();
}
//列
int TableModel::columnCount(const QModelIndex &parent) const
{
Q_UNUSED(&parent);
return dataNum;
}
//行
int TableModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(&parent);
return RowNum;
}
//返回指定索引的数据,即将数值映射为文字
QVariant TableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
{
return QVariant();
}
if (role == Qt::DisplayRole)
{
return Data[index.column()][index.row()];
}
if(role == Qt::TextAlignmentRole)
{
return int(Qt::AlignHCenter | Qt::AlignVCenter);
}
return QVariant();
}
//获取行数据
QStringList TableModel::getRowData(int row)
{
QStringList strList;
for (int i=0; i<dataNum; i++)
{
strList << Data[i][row];
}
return strList;
}
//获取头数据
QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role == Qt::DisplayRole && orientation == Qt::Horizontal)
{
return header[section];
}
return QAbstractTableModel::headerData(section, orientation, role);
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTextCodec>
#include <QSqlDatabase>
#include <QMessageBox>
#include <QSqlQuery>
#include <QTime>
#include <QSqlError>
#include <QtDebug>
#include <QSqlDriver>
#include <QSqlRecord>
#include <QFile>
#include "tablemodel.h"
#include "itemdialog.h"
class TableModel;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_Record_clicked();
void on_Insert_clicked();
void on_Sort_clicked();
void on_Update_clicked();
void on_Delete_clicked();
void on_Add_clicked();
void on_tableView_doubleClicked(const QModelIndex &index);
private:
Ui::MainWindow *ui;
ItemDialog itemDialog;
TableModel tableModel;
QSqlDatabase db;
QSqlQuery query;
QTime t;
long records;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
/*
QSqlQuery类提供执行和操作的SQL语句的方法
可以用来执行DML(数据操作语言)语句,如SELECT INSERT UPDATE DELETE
以及DDL(数据定义语言)语句,例如CREAT TABLE
也可以用来执行哪些不是标准的SQL的数据库特定的命令
QString create_sql = "create table student(id int primary key, name varchar(30), age int)"
QString select_max_sql = "select max(id) from student"
QString insert_sql = "insert into student values(?, ?, ?)"
QString update_sql = "update student set name = :name where id = :id"
QString select_sql = "select id, name from student"
QString select_all_sql = "select *from student"
QString delete_sql = "delete from student where id = ?"
QString clear_sql = "delete from student"
*/
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
//列表显示
ui->tableView->verticalHeader()->setVisible(false);
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui->tableView->setModel(&tableModel);
//数据库相关操作
db = QSqlDatabase::addDatabase("QSQLITE");
db.setHostName("zzy-PC"); //设置数据库主机名称
db.setDatabaseName("Database.db"); //设置数据库名
db.setUserName("zzy"); //设置数据库用户名
db.setPassword("123456"); //设置数据库密码
if (!db.open())
{
ui->textEdit->insertPlainText(tr("打开数据库失败!\n"));
ui->textEdit->moveCursor(QTextCursor::End);
}
//表相关操作
query = QSqlQuery(db);
//判断数据库中表是不是存在
query.exec("select * from sqlite_master where type='table' and name='automobil'");
bool isTableExist = query.next();
if(!isTableExist)
{
//创建数据库表
bool success = query.exec("create table automobil"
"(id int primary key,"
"attribute varchar,"
"type varchar,"
"kind varchar,"
"nation int,"
"carnumber int,"
"elevaltor int,"
"distance int,"
"oil int,"
"temperature int)");
if (success)
{
ui->textEdit->insertPlainText(tr("数据库表创建成功!\n"));
ui->textEdit->moveCursor(QTextCursor::End);
}
else
{
ui->textEdit->insertPlainText(tr("数据库表创建失败!\n"));
ui->textEdit->moveCursor(QTextCursor::End);
}
}
else
{
ui->textEdit->insertPlainText(tr("数据表已存在!\n"));
}
//记录
records = 100;
t.start();
}
MainWindow::~MainWindow()
{
delete ui;
}
//查询
void MainWindow::on_Record_clicked()
{
query.exec("select * from automobil");
QSqlRecord rec = query.record();
ui->textEdit->insertPlainText(tr("automobil表字段数:") + QString::number(rec.count()) + "\n");
QStringList strList;
QString str;
while(query.next())
{
for (int i=0; i<tableModel.columnCount(); i++)
{
str = query.value(i).toString();
strList << str;
}
}
query.last();
tableModel.ClearitemData();
tableModel.AdditemData(strList, query.at()+1);
ui->tableView->scrollToBottom();
}
//插入
void MainWindow::on_Insert_clicked()
{
t.restart();
query.prepare("insert into automobil values(?,?,?,?,?,?,?,?,?,?)");
for (int i=0; i<records; i++)
{
query.bindValue(0, i);
query.bindValue(1, tr("四轮"));
query.bindValue(2, tr("轿车"));
query.bindValue(3, tr("富康"));
query.bindValue(4, rand()%100);
query.bindValue(5, rand()%10000);
query.bindValue(6, rand()%300);
query.bindValue(7, rand()%200000);
query.bindValue(8, rand()%52);
query.bindValue(9, rand()%100);
bool success = query.exec();
if (!success)
{
QSqlError lastError = query.lastError();
ui->textEdit->insertPlainText(lastError.driverText()+tr("插入失败\n"));
}
}
ui->textEdit->insertPlainText(tr("输入%1条记录,耗时:%2 ms").arg(records).arg(t.elapsed()) + "\n");
}
//排序
void MainWindow::on_Sort_clicked()
{
t.restart();
bool success = query.exec("select * from automobil order by id desc");
if (success)
{
ui->textEdit->insertPlainText(tr("排序%1条记录, 耗时:%2 ms").arg(tableModel.rowCount()).arg(t.elapsed()) + "\n");
}
else
{
ui->textEdit->insertPlainText(tr("排序失败!\n"));
}
}
//更新
void MainWindow::on_Update_clicked()
{
QStringList strList;
int rowNum =0;
t.restart();
rowNum = ui->tableView->currentIndex().row();
if (rowNum > 0)
{
strList = tableModel.getRowData(rowNum);
itemDialog.setData(strList);
if (itemDialog.exec() == QDialog::Accepted)
{
QString str;
str = strList.at(0);
query.prepare(QString("update automobil set "
"attribute = ?,"
"type = ?,"
"kind = ?,"
"nation = ?,"
"carnumber = ?,"
"elevaltor = ?,"
"distance = ?,"
"oil = ?,"
"temperature = ?"
"where id = %1").arg(str.toInt()));
query.bindValue(0, itemDialog.dataList.at(1));
query.bindValue(1, itemDialog.dataList.at(2));
query.bindValue(2, itemDialog.dataList.at(3));
query.bindValue(3, itemDialog.dataList.at(4));
query.bindValue(4, itemDialog.dataList.at(5));
query.bindValue(5, itemDialog.dataList.at(6));
query.bindValue(6, itemDialog.dataList.at(7));
query.bindValue(7, itemDialog.dataList.at(8));
query.bindValue(8, itemDialog.dataList.at(9));
bool success = query.exec();
if(!success)
{
QSqlError lastError = query.lastError();
ui->textEdit->insertPlainText(lastError.driverText() + tr("更新失败!\n"));
}
strList.clear();
strList = itemDialog.dataList;
strList.replace(0, str);
tableModel.updateRow(strList, rowNum);
}
}
ui->textEdit->insertPlainText(tr("更新1条记录,耗时:%1 ms").arg(t.elapsed()) + "\n");
ui->textEdit->moveCursor(QTextCursor::End);
}
//删除
void MainWindow::on_Delete_clicked()
{
QStringList strList;
QString str;
int rowNum = 0;
int sqlID = 0;
rowNum = ui->tableView->currentIndex().row();
if (rowNum >= 0)
{
strList = tableModel.getRowData(rowNum);
str = strList.at(0);
sqlID = str.toInt();
t.restart();
tableModel.removeRow(rowNum);
query.exec(tr("delete from automobil where id=%1").arg(sqlID));
ui->textEdit->insertPlainText(tr("删除一条记录,耗时:%1 ms").arg(t.elapsed()) + "\n");
}
}
//添加
void MainWindow::on_Add_clicked()
{
int rowNum =0;
QStringList strList;
rowNum = tableModel.rowCount();
if (rowNum > 0)
{
strList = tableModel.getRowData(rowNum-1);
}
else
{
for (int i=0; i<tableModel.columnCount(); i++)
{
strList << "";
}
}
itemDialog.setData(strList);
if (itemDialog.exec() == QDialog::Accepted)
{
QString str;
query.prepare("insert into automobil values(?,?,?,?,?,?,?,?,?,?)");
str = itemDialog.dataList.at(0);
query.bindValue(0, str.toInt());
query.bindValue(1, itemDialog.dataList.at(1));
query.bindValue(2, itemDialog.dataList.at(2));
query.bindValue(3, itemDialog.dataList.at(3));
query.bindValue(4, itemDialog.dataList.at(4));
query.bindValue(5, itemDialog.dataList.at(5));
query.bindValue(6, itemDialog.dataList.at(6));
query.bindValue(7, itemDialog.dataList.at(7));
query.bindValue(8, itemDialog.dataList.at(8));
query.bindValue(9, itemDialog.dataList.at(9));
bool success = query.exec();
if (!success)
{
QSqlError lastError = query.lastError();
ui->textEdit->insertPlainText(lastError.driverText()+tr("添加失败\n"));
}
else
{
tableModel.AdditemData(itemDialog.dataList, 1);
ui->tableView->scrollToBottom();
ui->textEdit->insertPlainText(tr("添加成功\n"));
}
}
}
//列表框双击
void MainWindow::on_tableView_doubleClicked(const QModelIndex &index)
{
QStringList strList;
strList = tableModel.getRowData(index.row());
itemDialog.setData(strList);
itemDialog.exec();
}
3,效果: