sqlite操作
一个小型本地化操作,简单方便好用
封装 类如下:
//初始化部份
QSqlDatabase m_db;
LensSqliteDBControl::LensSqliteDBControl(const QString &strDatabase):m_strDatabase(strDatabase)
{
createConnection(m_strDatabase);
}
LensSqliteDBControl::~LensSqliteDBControl()
{
m_db.close();
}
bool LensSqliteDBControl::createConnection(const QString &database)
{
//与数据库建立连接
if (QSqlDatabase::contains("my_conn"))
{
m_db = QSqlDatabase::database("my_conn");
}
else
{
m_db = QSqlDatabase::addDatabase("QSQLITE", "logData");
}
//设置数据库名 别的名字不管,这个放在运行目录下
m_db.setDatabaseName("database.db");
//打开数据库
if (!m_db.open())
{
qDebug() << "maoxue Open database failed!";
return false;
}
else
{
qDebug() << "maoxue Open database true!";
return true;
}
}
//操作函数 分两种情况,一种是直接 执行的,一种是MODEL方式
//返回一个整型ID,拿到查询结果返回的第一个值,查询不带参
int LensSqliteDBControl::ExecuteInt(const QString& strQuery){if(!m_db.isOpen()){
bool res=createConnection(m_strDatabase);if(res==false){
return -1;}
}
QSqlQuery query(m_db);query.prepare(strQuery);
query.exec();
int ID = 0;while(query.next()){
ID = query.value(0).toInt();}
return ID;}//返回一个整型ID,拿到查询结果返回的第一个值,查询带多个参数
int LensSqliteDBControl::ExecuteInt(const QString& strQuery, QList<QVariant> lstParameter){if(!m_db.isOpen()){
createConnection(m_strDatabase);}
QSqlQuery query(m_db);query.prepare(strQuery);
for(int i = 0; i < lstParameter.count(); i++)query.bindValue(i, lstParameter[i]);query.exec();
int ID = 0;while(query.next()){
ID = query.value(0).toInt();}
return ID;}//返回一个整型ID,拿到查询结果返回的第一个值,查询带一个参数
int LensSqliteDBControl::ExecuteInt(const QString& strQuery, QVariant Parameter){if(!m_db.isOpen()){
createConnection(m_strDatabase);}
QSqlQuery query(m_db);query.prepare(strQuery);
query.bindValue(0, Parameter);query.exec();
int ID = 0;while(query.next()){
ID = query.value(0).toInt();}
return ID;}//只返回是否执行的结果
bool LensSqliteDBControl::Execute(const QString& strQuery, QVariant Parameter){if(!m_db.isOpen()){
createConnection(m_strDatabase);}
QSqlQuery query(m_db);query.prepare(strQuery);
query.bindValue(0, Parameter);return query.exec();}bool LensSqliteDBControl::Execute(const QString& strQuery, QList<QVariant> lstParameter){if(!m_db.isOpen()){
createConnection(m_strDatabase);}
QSqlQuery query(m_db);query.prepare(strQuery);
for(int i = 0; i < lstParameter.count(); i++)query.bindValue(i, lstParameter[i]);return query.exec();}//查询结果返回查询到到的最后一个结果的第一个值 qstring类型QString LensSqliteDBControl::ExecuteString(const QString& strQuery){if(!m_db.isOpen()){
createConnection(m_strDatabase);}
QSqlQuery query(m_db);query.prepare(strQuery);
query.exec();
QString temp;while(query.next()){
temp = query.value(0).toString();}
return temp;}//Model操作部份
void LensSqliteDBControl::ExecuteQueryModel(QSqlQueryModel *p_queryModel, const QString& strQuery){if(!m_db.isOpen()){
createConnection(m_strDatabase);}
p_queryModel->setQuery(strQuery, m_db);}void LensSqliteDBControl::ExecuteQueryModel(QSqlQueryModel *p_queryModel, const QString& strQuery,QList<QVariant> lstParameter){if(!m_db.isOpen()){
createConnection(m_strDatabase);}
QSqlQuery query(m_db);query.prepare(strQuery);
for(int i = 0; i < lstParameter.count(); i++)query.bindValue(i, lstParameter[i]);query.exec();
p_queryModel->setQuery(query);
}void LensSqliteDBControl::ExecuteQueryModel(QSqlQueryModel *p_queryModel, const QString& strQuery,QVariant Parameter){if(!m_db.isOpen()){
createConnection(m_strDatabase);}
QSqlQuery query(m_db);query.prepare(strQuery);
query.bindValue(0, Parameter);query.exec();
p_queryModel->setQuery(query);
}
//调用方式
//查询返回一个QSTRING ,只返回查到的第一条第一个字段的值
QString LensSqliteDBControl::selectResImgFromLogData( int _logId ){QString str=QString("select resultImg from logData where logId=%1").arg(_logId);qDebug() << "ExecuteString(str)" << ExecuteString(str) << " "<< str;return ExecuteString(str);}
//mode调用方式,MODEL会返回值,可读出修改
QString strTem;QList<QVariant> lstParameterTem;QVariant temName;strTem="select circleCount,isLineDistance,distance,circleMap from temData where temName = ? ";lstParameterTem.push_back(temName);QSqlQueryModel *m_TemDataModel= new QSqlQueryModel;//执行ExecuteQueryModel(m_TemDataModel,strTem,lstParameterTem);
//取值QSqlRecord recordtem = m_TemDataModel->record(0);int temCircleCount=recordtem.value(0).toInt();bool temIsLineDistance=recordtem.value(1).toBool();//插入//插入带参数值
QString str="INSERT INTO logData VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";QList<QVariant> lstParameter;maxId=maxId+1;QVariant id=maxId;QVariant time=_DateTime;QVariant modelName=_ModelName;QVariant deteCount=_detectCount;QVariant MatchCount=_MatchCount;QVariant resultImg=_imgFileName;QVariant batchId=_batchID;QVariant serialNum=_serialNum;
lstParameter.push_back(id);
lstParameter.push_back(time);
lstParameter.push_back(modelName);
lstParameter.push_back(deteCount);
lstParameter.push_back(MatchCount);
lstParameter.push_back(resultImg);
lstParameter.push_back(batchId);
lstParameter.push_back(serialNum);
lstParameter.push_back(detailResultBytes);
lstParameter.push_back(detailCircleCountBytes);
lstParameter.push_back(detailCircleDataBytes);
lstParameter.push_back(detailLineDistBytes);
lstParameter.push_back(detailOcrNumBytes);
lstParameter.push_back(detailOcrStringBytes);
lstParameter.push_back(detailAverDataBytes);
bool res= Execute(str,lstParameter);
//有一个东西记录一下
因为查询时返回一个QSqlQueryModel 有的时个你会想对这个MODEL进行修改方法如下,我修改时没有用QSqlQueryModelQSqlTableModel
修改完后,你可以直接在TABLEWIDTE SETMODEL就会得到你修改的值//这里有一个东西一直没弄好,我不知道怎么才能插入新的字段,应该是我不会提交,只修改,所以能插入字段但不能加内容我采用了一种方法,直接在查找时就多写了几个字段,然后修改完后,再删除 掉不要的str="select log.logId,log.serialNum,log.detectionTime,log.modelName,log.detectCount,log.matchCount,batch.batchName,
log.logId,log.logId,log.logId,log.detailDataAver from logData AS log ,batchData AS batch where batch.batchId=log.belongBatchId and detectionTime > ? and detectionTime < ? and modelName = ? and detectCount > matchCount and log.belongBatchId = ?";
lstParameter.push_back(batchId);
ExecuteQueryModel(m_model,str,lstParameter);
//设置保存策略为手动提交,这个超级重要,不然动一行,他妈的就自动提交了,只能改一行m_model->setEditStrategy(QSqlTableModel::OnManualSubmit);
//设置表头
if(!(m_model->columnCount() == 0 && m_model->rowCount()==0)){
m_model->setHeaderData(0,Qt::Horizontal,QString::fromLocal8Bit("ID"));m_model->setHeaderData(1,Qt::Horizontal,QString::fromLocal8Bit("条形码"));m_model->setHeaderData(2,Qt::Horizontal,QString::fromLocal8Bit("检测时间"));m_model->setHeaderData(3,Qt::Horizontal,QString::fromLocal8Bit("模板"));m_model->setHeaderData(4,Qt::Horizontal,QString::fromLocal8Bit("检测总数"));m_model->setHeaderData(5,Qt::Horizontal,QString::fromLocal8Bit("匹配总数"));m_model->setHeaderData(6,Qt::Horizontal,QString::fromLocal8Bit("批次名称"));}
//这样可以修改指定行的值m_model->setData(m_model->index(i,7+j),k);//前面我是多添加了几列,如果后面用不到又可以删除掉m_model->removeColumn(i);最后可以将m_model给tabwidget