QT5中使用SQLite3相关知识
QT5中是通过QT提供的类QSqlDatabase和QSqlQuery来操作数据库SQLite3的,QSqlDatabase类主要负责建立数据库连接,QSqlQuery类主要负责具体操作数据库,比如增删改查等等这些,具体如下: (温馨提示:Qt工程所在路径最好不要有中文字符、.pro工程文件记得添加sql支持)
1、QSqlDatabase类的使用——连接数据库
QSqlDatabase db;
if(QSqlDatabase::contains("qt_sql_default_connection"))
{
db = QSqlDatabase::database("qt_sql_default_connection");
qDebug() << "default connection";
}
else
{
db = QSqlDatabase::addDatabase("QSQLITE");
qDebug() << "don't exists default connection";
}
db.setDatabaseName("D:\\Qt\\Qtproject\\sqlitebase\\my.db");
if( ! db.open())
{
qDebug() << db.lastError().text();
}
qDebug() << "open success";
db.setDatabaseName("D:/Qt/Qtproject/sqlitebase/my.db");
db.setDatabaseName("D:\\Qt\\Qtproject\\sqlitebase\\my.db");
上述2种方式都可以操作已经存在的my.db数据库文件,最好使用绝对路径,相对路径我没试过,第二种为什么要" \ \" 具体我也咩研究过,猜测估计是因为转义字符这些,这样操作的好处是数据库文件我们可以单独处理,比如Windows下我们可以用一些可视化软件操作数据库会更加方便;eg:SQLiteStudio等等 然后将准备好的数据库文件拷贝到需要的地方,因为SQLite数据库是以文件的形式保存的,十分简洁,因此嵌入式领域常选择它。
db.setDatabaseName("my.db");
该方法会在程序编译后自动生成一个my.db数据库文件,具体存放路径就是对应的工程build-Desktop_Qtversion_-----_Debug文件夹下。这种方式创建的数据库如果不在Qt中操作,默认是个空的数据库。 那么这时我们就可以通过QSqlQuery类在Qt中创建我们自己所需要的表格等相关结构数据:
2、QSqlQuery类的使用——具体操作数据库
具体方法就是通过QSqlQuery类的exec方法来执行SQL语句 这里我也遇到过一个问题,就是在QT中使用数据库,需要向数据库里插入数据时,如果多次运行qt程序,每次运行都会不向数据库里掺入数据,这显然不是我们想要的结果,那么有没有一种方法就只在第一次运行qt程序时一次性完成向数据库掺入数据,供程序后面使用,后面运行也就不再掺入数据。想了半天,最后终于找到了一个解决的办法(仅供参考) 举个例子,我们要向刚刚创建的数据库中,创建表格并掺入几条数据: 第一次操作数据的时候做一个判断,如果不存在对应的表格,就完成表格的创建并掺入数据,如果存在对应的表格就不掺入数据,另做其他处理(自定义)那么第二次运行时判断到表格存在,就不会再掺入数据了,具体实现如下:
void sqlite_init()
{
QSqlDatabase db;
if(QSqlDatabase::contains("qt_sql_default_connection"))
{
db = QSqlDatabase::database("qt_sql_default_connection");
qDebug() << "default connection";
}
else
{
db = QSqlDatabase::addDatabase("QSQLITE");
qDebug() << "don't exists default connection";
}
db.setDatabaseName("my.db");
if( ! db.open())
{
qDebug() << db.lastError().text();
}
qDebug() << "open success";
QSqlQuery query;
query.exec("select count(*) from sqlite_master where type='table' and name='market'");
if(query.next())
{
if(query.value(0).toInt()==0)
{
qDebug() << "table market doesn't exit";
if(!query.exec("create table if not exists market(blockname varchar,lineX int,colY int)"))
{
qDebug() << query.lastError().text();
}
qDebug() << "create table market success";
query.exec("insert into market values('蔬菜水果类',100,0)");
query.exec("insert into market values('食品零食类',250,0)");
qDebug() << "insert market table success";
}
else
{
qDebug() << "table market exits";
}
}
query.exec("select count(*) from sqlite_master where type='table' and name='salegoods'");
if(query.next())
{
if(query.value(0).toInt()==0)
{
qDebug() << "table salegoods doesn't exit";
query.exec("create table if not exists salegoods(goodsname varchar,blockname varchar,nowprice float,oldprice float)");
qDebug() << "create table salegoods success";
query.exec("insert into salegoods values('商品1','蔬菜水果类',4.8,5.8)");
query.exec("insert into salegoods values('商品2','食品零食类',12,20)");
qDebug() << "insert salegoods table success";
}
else
{
qDebug() << "table salegoods exits";
}
}
}
第一次编译运行结果: 第二次运行结果: 最后的数据库文件数据:
|