標籤:
恢複索引時碰到的六個問題:
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();
}
}
就為這幾個問題,鬱悶了整整半天,都準備閑看別的文章了,才忽然豁然開朗(主要是第一個問題)。我都是老手了,怎麼還遇到這麼多問題呢。。。
恢複索引時碰到的六個問題(莫非編程行業的坑特別多?)