1.发现问题
在做一个Qt+Sqllite的程序时,定义了一个QSqlTableModel变量在MainWindow类(QSqlTableModel model;)中,可是无论怎么都无法从数据库表中读出数据(数据库连接是成功的)。
#endif // MAINWINDOW_H
2.问题进展
无法运行后发现之前写的代码是定义成指针的形式的,如:QSqlTableModel *model;,这时在MainWindow的构造函数中需要new一下,果然可以输出数据库表中内容。
3.解决问题
于是果断的查询了下源码和帮助文档
如果数据库是无效的,不链接默认的数据库中。所以推测在MainWindow类是定义变量QSqlTableModel model;无法在定义时链接到打开的数据库(或者说此时数据库还没有打开)。
所以如果在MainWindow类中定义就要定义成指针的形式。
database.h代码
#ifndef DATABASE_H
#define DATABASE_H
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QObject>
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("waterData.db");
if(!db.open()) return false;
QSqlQuery query;
query.exec(QObject::tr("create table user (id int, name vchar primary key,passWord vchar)"));
query.exec(QObject::tr("insert into user values (1,'Tom',999)"));
query.exec(QObject::tr("insert into user values (2,'Lily',888)"));
query.exec(QObject::tr("insert into user values (3,'Lucy',666)"));
query.exec(QObject::tr("insert into user values (4,'小强',555)"));
return true;
}
#endif // DATABASE_H
MainWindow.h代码
在Mainwindow类中定义QSqlTableModel *model;
MainWindow构造函数代码
bool sqlState =createConnection();
if(sqlState)
{
qDebug()<<"The database is open !";
}
else
{
qDebug()<<"open failed !";
}
model->setTable("user");
model->select();
for(int i=0;i<model->rowCount();++i)
{
QSqlRecord record = model->record(i);
QString name = record.value("id").toString();
qDebug()<<name<<__FUNCTION__;
}
model = new QSqlTableModel();
model->setTable("user");
model->select();
for(int i=0;i<model->rowCount();++i)
{
QSqlRecord record = model->record(i);
QString name = record.value("id").toString();
qDebug()<<name<<__FUNCTION__;
}