QT与SQLite数据库学习资料

  • 格式:docx
  • 大小:71.75 KB
  • 文档页数:16

当然我们一定要记住这个顺序,先创建数据库,然后再去创建一个表(作为菜鸟的我犯这个错误了),还有一点需要注意的红色标记的那句话,我参考的数籍一般都这样写db.setDatabaseName(":memory:");这样就把生成的数据库文件是在内存当中的,在工程文件目录下找不到。

上面使我们创建了一个数据库和一个表,那么我们如何把它呈现在我们的QTableview部件上呢?QSqlTableModel *model = new QSqlTableModel;model->setTable("person");model->setEditStrategy(QSqlTableModel::OnManualSubmit);model->select();ui->tableView->setModel(model);ui->tableView->show();上面的代码就把数据库中的信息不加筛选的打印到控件上了。

第一次写博客大家多多包涵。

Qt中提高sqlite的读写速度SQLite数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度。

例如:向数据库中插入100万条数据,在默认的情况下如果仅仅是执行query.exec("insert into DataBase(......)values(......)");就会打开和关闭文件100万次,所以速度当然会很慢。

SQLite 数据库是支持事务操作的,于是我们就可以通过事务来提高数据库的读写速度。

事务的基本原理是:数据库管理系统首先会把要执行的sql语句存储到内存当中,只有当commit()的时候才一次性全部执行所有内存中的数据库。

下面是一个简单的QT sqlite数据库事务的例子:#include <QtCore/QCoreApplication>#include <QtSql>#include <iostream>using namespace std;int main(int argc, char *argv[]){QCoreApplication a(argc, argv);QSqlDatabase db_sqlite = QSqlDatabase::addDatabase("QSQLITE", "connSQLite");db_sqlite.setDatabaseName("SQLiteDB.db3");db_sqlite.open();QSqlQuery query("", db_sqlite);bool bsuccess = false;QTime tmpTime;// 开始启动事务db_sqlite.transaction();tmpTime.start();for(int i = 0; i<100000; i++){bsuccess = query.exec("insert into DataBase(D_1,D_2,D_3,D_4,D_5) values('TT','TT','TT','TT','TT')");if (!bsuccess){cout<<"Error occur"<<endl;break;}}// 提交事务,这个时候才是真正打开文件执行SQL语句的时候db_mit();cout<<"10000条数据耗时:"<<tmpTime.elapsed()<<"ms"<<endl;}其实QT 操作sqlite数据库增加事务的功能就是上面例子中蓝色字体标出的两句话,如果去掉这两句话,程序又会还原为:打开文件——执行query.exec(...)——关闭文件。

大家可以试一下,添加这两句即增加事务以后数据插入的速度明显提高很多。

在入库和更新过程中按照数据库事务的思想进行设计:SQLite执行入库、更新操作的方式是,sql语句执行对象句柄调用库函数打开文件、调用函数执行sql 语句、关闭文件。

这样的执行方式对于数量级别超大的文件的弊端就是每次执行sql语句的时候都要打开文件(假设百万级数量级的数据,就要打开和关闭文件百万次),对于数据库的入库和更新操作时间主要都浪费到了文件的打开和关闭操作上,所以这里增加事务以解决该问题。

Qt数据库sqlite总结QSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类封装数据库所有记录QSqlRelationalTableModelQSqlQueryModelQSqlTableModel第一:QSqlDatabase类QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 采用QSQLITE数据库db.setHostName("localhost"); //设置数据库主机名db.setDatabaseName("test"); //设置数据库名db.setUserName("root"); //设置数据库登入用户名db.setPassword("123456"); //设计数据库登入密码db.open()打开数据库连接db.close();//释放数据库QStringList drivers = QSqlDatabase::drivers();//静态成员函数,是类的成员函数,不是对象的.返回所有可用的数据库驱动程序的清单drivers.removeAll("QMYSQL3"); //删除列表中的项foreach(QString driver, drivers) //遍历数据库驱动,测试数据库驱动种类qDebug() << “\t” << driver;第二:QSqlQuery类,查询数据库,插入值到数据库等操作数据库QSqlQuery query;query.prepare("INSERT INTO T_USER (name, age) VALUES (:name, :age)"); query.bin dValue(":name", "justin"); //在这定占位符上确定绑定的值query.bindValue(":age", 33);query.exec();QSqlQuery query; //以下执行相关SQL语句query.exec(“create table student(id int primary key,name varchar)”)//新建student表,id设置为主键,还有一个name项query.exec(“insert into student values(1,’xiaogang’)”);query.exec(“insert into student values(2,’xiaoming’)”);query.exec(“insert into student values(3,’xiaohong’)”);//向表中插入3条记录query.exec(“select * from student”);来查询出表中所有的内容。

其中的SQL语句“select * from student”中“*”号表明查询表中记录的所有属性。

而当query.exec(“select * from student”);这条语句执行完后,我们便获得了相应的执行结果,因为获得的结果可能不止一条记录,所以我们称之为结果集。

seek(int n) :query指向结果集的第n条记录。

指定当前的位置first() :query指向结果集的第一条记录。

last() :query指向结果集的最后一条记录。

next() :query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录。

previous() :query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录。

record() :获得现在指向的记录。

value(int n) :获得属性的值。

其中n表示你查询的第n个属性,比方上面我们使用“select * from student”就相当于“select id, name from student”,那么value(0)返回id属性的值,value(1)返回name属性的值。

该函数返回QVariant类型的数据,关于该类型与其他类型的对应关系,可以在帮助中查看QVariant。

at()//返回当前查询的位置QString name = query.value(0).toString(); //返回"name"字段的索引值"justin",value(i)返回i字段的值,0表示name,1表示ageint rowNum = query.at();//获取query所指向的记录在结果集中的编号int columnNum = query.record().count();//获取每条记录中属性(即列)的个数int fieldNo = query.record().indexOf(“name”);//获取”name”属性所在列的编号,列从左向右编号,最左边的编号为0int id = query.value(0).toInt();//获取id属性的值,并转换为int型QString name = query.value(fieldNo).toString();//获取name属性的值qDebug() << “rowNum is : ” << rowNum //将结果输出<< ” id is : ” << id<< ” name is : ” << name<< ” columnNum is : ” << columnNum;if(query.seek(2)) //seek指定当前的位置if(query.seek(ui->spinBox->value())){qDebug() << query.value(0).toInt() << query.value(1).toString();while(query.next()) //每执行一次该函数,便指向相邻的下一条记录。