0. 安装SQLite Expert,方便查看数据库中的数据。网站链接:http://www.sqliteexpert.com/
1. 常见错误:
ASSERT: "idx >= 0 && idx < s" in file ...
就我目前所了解的,出现这个错误多半是因为数据查询语句使用错误造成的。最好的办法就检查你的数据库查询语句时候正确,诸如单引号,空格这类问题要特别注意。
若直接使用QSqlQuery类,直接操作select语句,如:
QSqlQuery query;
query.exec("select * from log where channelId=1");
|
这种情况的错误还比较好判断,如果你建立的是一个QSqlRelationalTableModel,在setFilter()中设置查询语句时,select语句出错就不好查了。只能单步调试,看Qt底层生成的select语句是否正确。
filter = QString(" and areaId=%1").arg(areaId);
在这里查看query的值如下:
SELECT log."id", relTblAl_1.name AS subLogType_name_4, log."startDateTime", relTblAl_3.name AS user_name_3, relTblAl_4.name AS area_name_2, relTblAl_5.name, log."event" FROM log, subLogType relTblAl_1, user relTblAl_3, area relTblAl_4, channel relTblAl_5 WHERE ( log."subLogTypeId" = relTblAl_1.id AND log."userId" = relTblAl_3.id AND log."areaId" = relTblAl_4.id AND log."channelId" = relTblAl_5.id) AND (areaId=1) ORDER BY log."id" DESC |
这行查询语句看似正常,但却有一个隐藏的bug,这个问题也困扰了我大半天才解决。
将:
filter = QString(" and areaId=%1").arg(areaId); |
改成:
filter = QString(" and log.\"areaId\"=%1").arg(areaId);
|
问题就得到了解决。
总结下遇到的问题。
1. 使用sql查询语句时,一定要仔细检查,常见的错误是,单引号写成双引号,忽略空格.
2. 在使用诸如QSqlTableModel或QSqlRelationalTableModel这类高层接口时,setFillter()参数很关键,若出问题,最好的方法是单步调试到QSqlTableModel::select()函数中查看query的值是否更预期相符,除此,别无它法。