Qt之記憶體資料庫

2021-09-29 13:59:23 字數 2765 閱讀 5737

記憶體資料庫,顧名思義就是將資料放在記憶體中直接操作的資料庫。相對於磁碟,記憶體的資料讀寫速度要高出幾個數量級,將資料儲存在記憶體中相比從磁碟上訪問能夠極大地提高應用的效能。所以在有大量資料互動時使用記憶體資料庫,等到資料互動量降下來以後同步至本地資料庫也是個不錯的選擇。

下段**是我事先將部分資料插入記憶體資料庫,便於後續資料互動時查表使用。

/*

* @brief 將自檢資訊表存入記憶體資料庫中

* @return &memoryquery

*/qsqlquery* creatememorydbandstorescinfo()

stselfcheckinfo;

/** 在各列舉下不同索引對應的型別、主項、子項的值

* 在查表時找到對應位置下的索引值即可知道是哪個子項

*/stselfcheckinfo stscinfoarr[32] =

,,,,, //4

,,,,, //9

,,,,, //14

,,,,, //19

,,,,, //24

,,,,, //29

, //31

};qvariantlist idlist,typelist,mainitemlist,subitemlist;

for(int i = 0;i < 32;i++)

memorydb = qsqldatabase::adddatabase("qsqlite","memory");

memorydb.setdatabasename(":memory:");/// 記憶體資料庫,掉電會丟失

if(!memorydb.open())

memoryquery = qsqlquery::qsqlquery(memorydb);

/** 自檢列舉表

*/

qstring strmemoryquery = "create table scitemretrievaltable(id int8 not null primary key,type int8 not null,mainitem int8 not null, subitem int8 not null)";

memoryquery.exec(strmemoryquery);

/** 自檢資訊表

*/qstring strscinfoquery = "create table scinfotable (id integer primary key, datetime varchar(20),system varchar(10), testtype varchar(10), testindex varchar(20), testresult varchar(20))";

memoryquery.exec(strscinfoquery);

memoryquery.prepare("insert into scitemretrievaltable values(?,?,?,?)");

memoryquery.addbindvalue(idlist);

memoryquery.addbindvalue(typelist);

memoryquery.addbindvalue(mainitemlist);

memoryquery.addbindvalue(subitemlist);

memoryquery.execbatch(); ///批量寫入

return &memoryquery;

}

在空閒時同步資料:

/// 設定定時器開始同步記憶體資料庫至本地資料庫

qtimer::singleshot(1000,this,slot(syncscinfotolocaldb()));

不過現在同步的方法還有待改進...

// @brief 同步scinfo表至本地事件處理函式

void syncscinfotolocaldb()

stscinfo;

memoryquery = qsqlquery::qsqlquery(memorydb);

memoryquery.exec("select count(*) from scinfotable");

bool ret = memoryquery.next();

if(ret)

}qstring strsyncquery = "insert into testtable select '" + stscinfoarr[0].id + "'as 'id' ,'" + stscinfoarr[0].datetime + "'as 'datetime' ,'" + stscinfoarr[0].system + "'as 'system', '" + stscinfoarr[0].testtype + "'as 'testtype' ,'"+ stscinfoarr[0].testindex + "'as 'testindex' ,'" + stscinfoarr[0].testresult + "'as 'testresult'";

qstring strsyncunionquery= "";

for(int j = 1;j < num;j++)

qsqlquery query;

query.setforwardonly(true);

query.exec(strsyncquery);

delete stscinfoarr;

stscinfoarr = null;

}}​

QT之記憶體洩漏

以入門的hello world 為例 我們將 main.cpp 修改如下 include include intmain int argc,char ar 示例程式我們已經講解完畢。下面再說一點。我們可以將上面的程式改寫成下面的 嗎?include include intmain int argc,...

ZK資料儲存之記憶體資料庫ZKDatabase

zkdatabase負責管理會話 datatree和事務日誌,向上層提供統一的資料操作介面,其基本結構如下圖所示 zkdatabase的初始化大致分為兩步 載入某個資料快照檔案,恢復某個時刻t的全量記憶體資料 初始化時,zk會載入最新的100個資料快照檔案,依次解析。首先,解析最新的資料快照檔案,如...

QT筆記之記憶體管理

鏈結錯誤解決辦法 我們都知道在c 中,new和delete是成對出現的,那麼在qt中記憶體中是不是同樣如此呢,我們來驗證一下。第一步新建工程 mywidget 第二步 新增乙個自定義的按鈕類 mybutton 第三步 修改自定義按鈕類的父類為qpushbutton qpushbutton也是繼承自q...