論述-Sqlite3 開發優化

1. 使用事務,將多條數據庫更改語句或者,循環遍歷語句放到一次事務中來處理。sql

     SqliteDB::startTransaction();數據庫

         do_CRUD;函數

         MayBe: SqliteDB::RollBack();ui

     SqliteDB::Commit();spa

 

2. 使用批處理執行參數爲集合類型的操做code

   QVariantList    bindValue1;sqlite

  QVariantList     bindValue2;進程

 QString   strSql = " delete from tablename where  field1 = ? and field2 = ?"事務

  QSqlquery sqlQuery.addbindValue(bindValue1);get

  QSqlquery sqlQuery.addbindValue(bindValue2);

     sqlQuery.queryBatch();

      getResult();

 

3. 通常對於插入操做,要返回插入數據庫後,所在行的自增加序號ID, 或者自定義的某一列。後續流程會用到這個ID,來標記數據行。

        兩種方式獲取插入自增加ID:

    -select last_insert_rowid() as newID from TableName

    select max(ID) from 表

    還能夠放在事務一塊兒處理。

注意的是:

SQLiteAPI 函數sqlite3_last_insert_rowid()能夠取得最後一條插入的記錄的rowid。但sqlite3_last_insert_rowid()是基於當前進程的。也就是說,sqlite3_last_insert_rowid()取到的是當前進程最後一次插入記錄的rowid。對於不是當前進程插入的記錄,sqlite3_last_insert_rowi()均返回0。sqlite3_last_insert_rowi()對應的SQL聲明爲last_insert_rowid(),

    

操做例子:

bool SampleRecordDAO::updatePrintStatus(const QSet<int> &sampleIdSet, bool isPrint)
{
    int sampleIdSize = sampleIdSet.size();
    if (sampleIdSize <= 0)
    {
        return true;
    }

    QSqlQuery query(SqliteDbHelper::Instance()->getDB());
    query.prepare("UPDATE SampleInfo SET ResultStatePrint = ? where ID = ? ");
    QVariantList stateList,idList;
    for (QSet<int>::const_iterator idItr = sampleIdSet.begin(); idItr != sampleIdSet.end(); ++idItr)
    {
        stateList << (int)isPrint;
        idList << *idItr;
    }
    query.addBindValue(stateList);
    query.addBindValue(idList);
    if (!query.execBatch())
    {
        revDebug << query.lastError().text();
        return false;
    }
    return true;
}

 

bool SampleRecordDAO::deleteSampleInfoAbout4Ids(QList<int> sampleIds)
{
    //1.Haven't Sample Id
    int sampleSize = sampleIds.size();
    if (sampleSize <= 0)
    {
        return true;
    }
    //2.Build Sample Id List
    QVariantList idList;
    for (int sampleIdx = 0; sampleIdx < sampleSize; ++sampleIdx)
    {
        idList << sampleIds.at(sampleIdx);
    }
    //3.Delete DB
    SqliteDbHelper::Instance()->startTransaction();
    QSqlQuery query(SqliteDbHelper::Instance()->getDB());
    do
    {
        query.prepare("DELETE FROM SampleInfo WHERE ID = ? ");
        query.addBindValue(idList);
        if (!query.execBatch())
        {
            break;
        }

        query.prepare("DELETE FROM SampleInfoOrg WHERE ID = ? ");
        query.addBindValue(idList);
        if (!query.execBatch())
        {
            break;
        }

        query.prepare("DELETE FROM MicroscopyInfoTable WHERE ID = ? ");
        query.addBindValue(idList);
        if (!query.execBatch())
        {
            break;
        }

        query.prepare("DELETE FROM SampleInforgraincountTable WHERE ID = ? ");
        query.addBindValue(idList);
        if (!query.execBatch())
        {
            break;
        }
        SqliteDbHelper::Instance()->commit();
        return true;
    }
    while(false);
    revDebug << query.lastError().text();
    SqliteDbHelper::Instance()->rollback();
    return false;
}
相關文章
相關標籤/搜索