sqlite操作

来源:互联网 发布:网络监控器怎么安装 编辑:程序博客网 时间:2024/05/20 18:52

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进行修改方法如下,我修改时没有用QSqlQueryModel 
QSqlTableModel
修改完后,你可以直接在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

原创粉丝点击