视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
sqlite 数据库
2025-10-01 04:45:01 责编:小OO
文档
sqlite 数据库

(2010-06-09 22:50:42) 

转载

标签: 

杂谈分类:QT

Qt: 查询数据库与tableview很容易一起使用

// 设置一下数据库的表名, 然后直接select()就搞定了. 非常简单.

void initializeModel(QSqlTableModel *model) {

    model->setTable("person");

    model->setEditStrategy(QSqlTableModel::OnRowChange);

    model->select();

    model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));

    model->setHeaderData(1, Qt::Horizontal, QObject::tr("First name"));

    model->setHeaderData(2, Qt::Horizontal, QObject::tr("Last name"));

}

// 使用model view

QTableView *createView(const QString &title, QSqlTableModel *model) {

    QTableView *view = new QTableView;

    view->setModel(model);

    view->setWindowTitle(title);

    return view;

}

QSqlTableModel model(&app, getDatabase());

initializeModel(&model);

QTableView *view1 = createView(QObject::tr("Table Model (View 1)"), &model);

view1->show();

sqlite简介

sqlite 是一款轻量级的、基于文件的嵌入式数据库,2000年就已经诞生,经过7年多的发展,直到今天已经成为最流行的嵌入式数据库,包括google在内的公司在其桌面软件中亦使用 sqlite 存储用户数据。由此可以看出,已经没有任何理由去怀疑sqlite的稳定性了。

sqlite 的优势

1. 免配置,和access一样,只要把数据库文件通过ftp上传到服务器上就可以使用,不需要服务器的额外支持

2. 备份方便,因为只是一个文件,只要复制一份该文件,就能备份整个数据库

3. 虽然是轻量级数据库,但他支持最大 2tb 的单个库文件。

4. 快,无与伦比的快。经过实际测试,在几百万记录的情况下,sqlite的插入和查询速度和 mysql 不分上下,快于 sql server,10倍于 access (但这并不意味着它可以替代 sql server )

用QT操作 sqlite

由于sqlite属于轻量级的数据库,不需要配置,不需要安装,也不需要管理员,所以也就没必要像操作mysql等数据库一样的设置主机,用户和密码了。样例如下:

#include

#include

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char *argv[])

{

    QApplication app(argc, argv);

    QTextEdit display;

    display.resize(400, 160);

    display.show();  //下面进行数据库的设置

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  //使用sqlite数据库驱动 

    db.setDatabaseName("test");  //我们之前建立的数据库

bool ok = db.open();  //尝试连接数据库

if (ok)

    {  //这里用text已经成功连上数据库

        QSqlQuery query;  //新建一个查询的实例

if (query.exec("select * from student"))   //尝试列出 student 表的所有记录

        {  //本次查询成功

int numRows = 0;  //询问数据库驱动,是否驱动含有某种特性 

if (db.driver()->hasFeature(QSqlDriver::QuerySize))

            {

                numRows = query.size();  //如果支持结果影响的行数,那么直接记录下来

            }

else

            {

                query.last(); //否则定位到结果最后,qt 文档说,这个方法非常慢

                numRows = query.at() + 1;

                query.seek(-1);

            }

            QString name, age;

            display.append("==========================================="); 

while(query.next())

            {  //定位结果到下一条记录

                name = query.value(0).toString();

                age = query.value(1).toString();

                QString result = name + " " + age;

                display.append(result);

            }

            display.append("===========================================");

            display.append(QString("totally %1 rows").arg(numRows) );

        }

else

        {  //如果查询失败,用下面的方法得到具体数据库返回的原因

            QSqlError error = query.lastError();

            display.append("From mysql database: " + error.databaseText());

        }

    }

else

    {  //打开数据库失败,显示数据库返回的失败描述

        display.append("cannot open database.");

        display.append("Reason: " + db.lastError().databaseText());

    }

    QApplication::connect(&app, SIGNAL(lastWindowClose()), &app, SLOT(quit()));

return app.exec();

}

QT 学习:根据数据库的内容动态添加Button

 

如果需要对数据库操作,必须在.pro文件中加入:

QT +=sql

 

代 码如下:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "mainwindow.h"

#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    //下面进行数据库的设置

   int i;

   QVBoxLayout *layInstruct = new QVBoxLayout;//ToolBox的Layout

   QToolBox *tbInstruct=new QToolBox();

   QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");  //使用sqlite数据库驱动

   db.setDatabaseName("G:\\\\SerialInstruct.db3");  //我们之前建立的数据库

   if (db.open())//尝试连接数据库

   {  //已经成功连上数据库

       QSqlQuery query;  //新建一个查询的实例

       if (query.exec("select * from UnitData"))   //尝试列出 student 表的所有记录

       {  //本次查询成功

           int numRows = 0;  //询问数据库驱动,是否驱动含有某种特性

           if (db.driver()->hasFeature(QSqlDriver::QuerySize))

               {

                   numRows = query.size();  //如果支持结果影响的行数,那么直接记录下来

               }

           else

           {

               query.last(); //否则定位到结果最后,qt 文档说,这个方法非常慢

               numRows = query.at() + 1;

               query.seek(-1);

           }

           QString name, age;

           i=0;

           while(query.next())

           {  //定位结果到下一条记录

               name = query.value(0).toString();

               age = query.value(1).toString();

               QString result = name + " " + age;

               QWidget *pages=new QWidget();

               tbInstruct->addItem(pages,age);

               QSqlQuery qryInstruct;//查询子表内容,用于创建Button

               if (qryInstruct.exec(QString("Select ID,Description from InstructList Where UnitID=%1").arg(i+1)))

               {

                   tbInstruct->setCurrentIndex(i);

                   QVBoxLayout *layout = new QVBoxLayout;//建立一个坚排的规则

                   while(qryInstruct.next())

                   {

                       QString sID,sCaption;

                       sID=qryInstruct.value(0).toString();

                       sCaption=qryInstruct.value(1).toString();

                       QPushButton *button = new QPushButton(sCaption);

                       button->setAccessibleDescription(sID);

                       button->setCheckable(true);

                       button->setAutoExclusive(true);

                       layout->addWidget(button);//把Button放入Layout中

                   }

                   layout->setSpacing(0);

                   pages->setLayout(layout);

               }

               i=i+1;

           }

           //ui->toolBox->removeItem(0);

           tbInstruct->setCurrentIndex(0);

           layInstruct->addWidget(tbInstruct);

           layInstruct->setSpacing(0);

           ui->centralWidget->setLayout(layInstruct);

       }

       else

       {  //如果查询失败,用下面的方法得到具体数据库返回的原因

           QSqlError error = query.lastError();

           //display.append("From mysql database: " + error.databaseText());

       }

   }

   else

   {  //打开数据库失败,显示数据库返回的失败描述

       //display.append("cannot open database.");

       //display.append("Reason: " + db.lastError().databaseText());

   }

}

MainWindow::~MainWindow()

{

    delete ui;

}

void MainWindow::changeEvent(QEvent *e)

{

    QMainWindow::changeEvent(e);

    switch (e->type()) {

    case QEvent::LanguageChange:

        ui->retranslateUi(this);

        break;

    default:

        break;

    }

}下载本文

显示全文
专题