第13章:SQLite

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,效果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ksmtnsv37297/article/details/86675528