前言:
一、新建个QT工程首先在这里并不是用QT自带的QSqlDatabase类来操作数据库,而是用纯C语言操作,因为QT是支持C/C++混合编程的,若想看QSqlDatabase类操作数据库,请查看我的博客。
二、在.Pro文件里添加sqlite3库文件链接
三、在.cpp文件中添加头文件LIBS += -lsqlite3
四、在main.cpp里转换编码类型(PS:我要操作中文,若只有英文或者数字,可以不修改编码类型)#include <sqlite3.h> #include "pack_firehost.h" //这是我的一个结构体定义的头文件,因为我是要操作结构体的,所以添加
QTextCodec *codec = QTextCodec::codecForName("GB2312"); QTextCodec::setCodecForCStrings(codec); QTextCodec::setCodecForTr(codec); QTextCodec::setCodecForLocale(codec);
五、下面是我.cpp文件的代码,懒得一步一步介绍了,挺简单的
#include "dialog.h" #include "ui_dialog.h" #include <sqlite3.h> #include <stdio.h> #include "pack_firehost.h" sqlite3 *s_report_db = NULL; Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); int rv; int i=0; sqlite3_stmt *stat = NULL; const void *blob_ptr; firehost_pack_t *pack; firehost_pack_t pk; QString time; pack=&pk; open_db();//打开数据库,函数的定义在下面 if(!s_report_db) { printf("report database not opened, try to open it now\n"); return; } rv = sqlite3_prepare_v2(s_report_db, "select id,packet from firehost;", -1, &stat, NULL); //解析SQL语句,并存入stat中 if(SQLITE_OK!=rv || !stat) { printf("firehost sqlite3_prepare_v2 failure\n"); return; } sqlite3_step(stat); //执行上面所解析的SQL语句,并返回第一条查询记录,并存在stat中 blob_ptr = sqlite3_column_blob(stat, 1); //从记录中获取第二个字段,我的是个结构体,所以用sqlite3_column_blob,如果是其他类型,得用相应的函数 memcpy(pack, blob_ptr, sizeof(*pack)); ui->evnet->setText(QString::number(pack->event)); for(i=0;i<6;i++) { if(i==0) time=time+QString::number(pack->time[i],16)+"年"; if(i==1) time=time+QString::number(pack->time[i],16)+"月"; if(i==2) time=time+QString::number(pack->time[i],16)+"日"; if(i==3) time=time+QString::number(pack->time[i],16)+"点"; if(i==4) time=time+QString::number(pack->time[i],16)+"分"; if(i==5) time=time+QString::number(pack->time[i],16)+"秒"; printf("time[%d]=%x\n",i,pack->time[i]); } ui->time->setText(time); ui->addr->setText(pack->pos_desc); sqlite3_finalize(stat); //释放stat } Dialog::~Dialog() { delete ui; } void Dialog::open_db() { const char *db_file = "./uited_report.db"; /*确定文件或文件夹的访问权限,成功执行返回0: F_OK 判断文件是否存在; R_OK 只判断是否有读权限; W_OK 只判断是否有写权限; X_OK 判断是否有执行权限 */ if( 0==access(db_file, F_OK) ) //判断文件是否存在 { if( SQLITE_OK != sqlite3_open(db_file, &s_report_db) ) //打开数据库 { printf("open report database file '%s' failure\n", db_file); return ; } printf("open report database file '%s' ok\n", db_file); } else { printf("fille not exist!\n"); return; } }