码迷,mamicode.com
首页 > 其他好文 > 详细

恢复索引时碰到的六个问题(莫非编程行业的坑特别多?)

时间:2016-01-14 23:55:40      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

恢复索引时碰到的六个问题:
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();
}
}

就为这几个问题,郁闷了整整半天,都准备闲看别的帖子了,才忽然豁然开朗(主要是第一个问题)。我都是老手了,怎么还遇到这么多问题呢。。。

恢复索引时碰到的六个问题(莫非编程行业的坑特别多?)

标签:

原文地址:http://www.cnblogs.com/findumars/p/5131790.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!