QSqlite使用整理

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,这个问题也困扰了我大半天才解决。
由于我使用的是QSqlRelationalTableModel,并设置了外键,并且在表log和表channel中使用了同名的areaId字段,所以查询语句在遇到WHERE (areaId=1)时,就无法判断是log表中的areaId字段,还是channel表中的areaId字段,因此return false,导致查询失败.
将:
filter = QString(" and areaId=%1").arg(areaId);
改成:
filter = QString(" and log.\"areaId\"=%1").arg(areaId);
问题就得到了解决。

总结下遇到的问题。
1. 使用sql查询语句时,一定要仔细检查,常见的错误是,单引号写成双引号,忽略空格.
2. 在使用诸如QSqlTableModel或QSqlRelationalTableModel这类高层接口时,setFillter()参数很关键,若出问题,最好的方法是单步调试到QSqlTableModel::select()函数中查看query的值是否更预期相符,除此,别无它法。


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值