今天在Qt的帮助手册里看到,可以用自己编译的sqlite库来替换qt源码中所带的sqlite。这样就好办了,可以更新Qt的sqlite3插件,编程的时候直接用Qt的数据库语句,上一章中用sqlite3的函数来编程,总感觉怪怪的。毕竟是写Qt sqlite程序,应该写成Qt的风格,后面使用Qt的数据模型就比较方便。
上一章中已经说了sqlite3源码的编译,这里我把通过交叉编译后安装在虚拟机上的qte目录和sqlite3目录打印下。
ws@ubuntu:~$ ls /usr/local/Trolltech/QtEmbedded-4.8.5-arm/ bin demos examples include lib mkspecs plugins tests translations
ws@ubuntu:~$ ls /usr/local/arm_sqlite/ bin include lib share接下来开始更新sqlite3插件。首先跳转到qt源码目录,依次执行以下命令。
cd /opt/FriendlyARM/mini210/linux/arm-qte-4.8.5/qt-everywhere-opensource-src-4.8.5/src/plugins/sqldrivers/sqlite export SQLITE=/usr/local/arm_sqlite /usr/local/Trolltech/QtEmbedded-4.8.5-arm/bin/qmake "INCLUDEPATH+=$SQLITE/include" "LIBS+=-L$SQLITE/lib -lsqlite3" make make install更新后的插件被安装在如下目录。
ws@ubuntu:~$ ls /usr/local/Trolltech/QtEmbedded-4.8.5-arm/plugins/sqldrivers/ libqsqlite.so将这个libsqlite.so拷贝到开发板上的相同路径即可。
接下来把上一章的工程修改下,按照Qt数据库应用来写,界面不变,功能不变,只是源码变了。相对而言,代码要简洁的多,效率就不大清楚了,回头测试一下。
首先看数据库的打开,代码如下。
//连接数据库 db = QSqlDatabase::addDatabase ("QSQLITE"); //设置驱动 db.setDatabaseName ("/apps/test.db"); if(!db.open ()) { QMessageBox::warning (0, QObject::tr("Database error"), db.lastError ().text ()); return; } qDebug()<<"Connect success\n";
void MainWindow::on_pushButton_ct_clicked() { const char *sSQL = "create table users (" "id integer PRIMARY KEY AUTOINCREMENT, " "name varchar(40) NOT NULL, " "age integer NOT NULL, " "birthday datetime NOT NULL, " "email varchar(40) NOT NULL);"; //执行建表SQL QSqlQuery query; query.exec(sSQL); rows = 0; index = 0; qDebug()<<"Datebase table creator success!!\n"; } void MainWindow::on_pushButton_ic_clicked() { rows++; QString sSQL = QString("insert into users values" "(%1, 'ws_%2', %3, '1989-5-4', '[email protected]');") .arg(rows).arg(rows).arg(20+rows); //执行插入数据 QSqlQuery query; query.exec(sSQL); ui->horizontalSlider->setMaximum(rows); qDebug()<<"Datebase insert success!\n"; } void MainWindow::on_pushButton_dc_clicked() { if(rows > 0) rows--; else{ qDebug()<<"No more row.."; return; } QString sSQL = QString("delete from users where id=%1").arg(rows+1); //执行删除数据 QSqlQuery query; query.exec(sSQL); ui->horizontalSlider->setMaximum(rows); qDebug()<<"Datebase delete success!\n"; } void MainWindow::on_pushButton_dt_clicked() { const char *sSQL = "drop table users"; //delete table QSqlQuery query; query.exec(sSQL); rows = 0; index = 0; qDebug()<<"Datebase table delete success!!\n"; }查询操作也要简单的多,没有回调函数了。
void MainWindow::on_pushButton_sn_clicked() { if(index < rows) index++; else index = rows; ui->textEdit->clear(); QString sSQL = QString("select * from users where id=%1").arg(index); //执行查询操作 QSqlQuery query; query.exec(sSQL); while(query.next()){ ui->textEdit->append(QString("id: ") + query.value(0).toString()); ui->textEdit->append(QString("name: ") + query.value(0).toString()); ui->textEdit->append(QString("age: ") + query.value(0).toString()); ui->textEdit->append(QString("birthday: ") + query.value(0).toString()); ui->textEdit->append(QString("email: ") + query.value(0).toString()); } ui->horizontalSlider->setValue(index); qDebug()<<"Datebase inquire success!!\n"; }查询表格最大行数也要简单多了,两句代码搞定。
//查询user表格中已有数据的行数 QSqlQuery query; query.exec("SELECT COUNT(*) FROM users"); if(query.next()) rows = query.value(0).toInt();程序在http://download.csdn.net/detail/westlor/9399394可以下载。