恢複索引時碰到的六個問題(莫非編程行業的坑特別多?)

來源:互聯網
上載者:User

標籤:

恢複索引時碰到的六個問題:
1. 切記不要使用外部sqlite工具開啟觀察資料庫情況,看的時候舒服,調試的時候卻忘了關閉它,導致無論怎麼關閉資料庫都不行(rename檔案總是失敗)

2. 解壓縮到目前的目錄,哪一個目錄要寫清楚(預設可能會解壓縮到可執行檔的目錄下),但是解壓縮後的檔案名稱不用寫,因為壓縮包裡的檔案是什麼名字就是什麼名字

3. 必須要等m_database對象消失了,才能移除這個資料庫
http://doc.qt.io/qt-5/qsqldatabase.html#removeDatabase
徹底關閉的話,可能需要執行 QSqlDatabase::removeDatabase(strIndex); 否則會有名字殘留(記憶體對象應該不會殘留)

但是去掉這個名字,還必須在QSqlDatabase m_database消失之後,可這個是類成員形式的對象,怎麼消失?只能增加一個靜態函數Free:
void DBTool::Free(DBTool* tool)
{
// OO 利用靜態函數銷毀對象,還能做額外的事情,比簡單的delete強
QString strIndex = tool->m_uniquename;
if (tool) {
delete tool;
//tool = NULL; // OO ccc 把傳入的指標初始化是沒有意義的,指標自身也只是一個拷貝值
QSqlDatabase::removeDatabase(strIndex);
DBTool::m_dbnames.removeAll(strIndex);
}
}
,這樣以後就不能使用delete mydb了,必須要DBTool::Free(System::m_index)這樣使用。

4. 靜態變數一定要在cpp檔案中初始化,即使靜態變數本身是一個變數(不是指標),也仍然需要初始化一下,如下:
QStringList DBTool::m_dbnames;

5. 傳入指標到函數裡,把指標設定成NULL是沒有意義的。必須要這樣寫:
if (System::m_index) {
DBTool::Free(System::m_index);
// delete System::m_index;
qDebug() << System::m_index;
System::m_index = NULL;
}
否則第二次點擊按鈕的時候,會嘗試刪除一個已經不存在的對象,程式立即崩潰!

6. 如果資料庫根本沒有被開啟過,此時想提交資料必然出錯。平時不出錯是因為問題被掩蓋了。所以要加上對當前資料庫連接是否有效和是否開啟,要進行判斷:
LogTool::~LogTool(void)
{
if (m_database.isValid() && m_database.isOpen()) {
m_database.commit();
m_database.close();
}
}

就為這幾個問題,鬱悶了整整半天,都準備閑看別的文章了,才忽然豁然開朗(主要是第一個問題)。我都是老手了,怎麼還遇到這麼多問題呢。。。

恢複索引時碰到的六個問題(莫非編程行業的坑特別多?)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.