在qt开发过程中,有时候会有一些配置需要我们保存记录,如果对于这些配置的只是单纯的保存,那么我们可以有多种选择,一般会选择比较简单的ini配置文件,或者xml文件,但是有时候会有多套需要保存,那么ini和xml就显得不太实用了, 这里就有必要用到qt自带的一个小型数据库sqlite,下面就项目开发中,sqlite的使用,做下详细的说明。
首先,在新建的QT creator工程中的pro文件中添加sqlite的配置,QT+=sql,或者直接在QT+=core gui后边直接添加sql,执行qmake即可,这样sqlite就添加到我们的工程中了。
在.h文件中,添加sqlite的头文件,
#include<QSqlDatabase>
#include<QSqlQuery>
#include<QSqlRecord>
#include<QSqlError>
在使用sqlite时,第一步添加驱动:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
第二步,设置数据库名称:
db.setDatabaseName("./my.db");
if (!db.open())
{
qDebug() << "open db failed!";
}
第三步,创建数据表:
QString createSql = QString("create table if not exists student(
id integer primary key not null,
user_name text not null,
ip text not null,
port int not null,
password text not null)");
QSqlQuery *pQuery = new QSqlQuery();
pQuery->prepare(createSql);
if (pQuery->exec())
{
qDebug() << "Error : Fail to create table." << pQuery->lastError();
}
第四步,增删改查操作
插入数据:
注:id类型时integer,默认时自增类型,不用重复赋值。
pQuery->prepare("insert into student(user_name,ip,port,password) values(:userName,:ip,:port,:password)");
pQuery->bindValue(:userName,"user1");
pQuery->bindValue(:ip,"127.0.0.1");
pQuery->bindValue(:port,"5000");
pQuery->bindValue(:password,"*****");
pQuery->exec();
删除数据:
pQuery->prepare("delete from student where id = :id");
qQuery->bindValue(:id,"1");
如果表中有自增序列,这里的id就是自增序列,直接调用delete from student是不能把自增序列删除掉的, 还必须调用delete from student where name = 'student',这样就可以把该表的递增数归零。
更新数据:
pQuery->prepare("update student set password = '*****' where user_name = 'user1';
pQuery->exec();
查询数据并获取结果集:
pQuery->prepare("select * from student");
pQuery->exec();
QSqlRecord record = pQuery->record();
int column = record.count();
typedef struct _testInfo
{
int id;
QString userName;
QString ip;
QString port;
Qstring password;
}testInfo;
QVector<testInfo> m_infoVect;
while(pQuery->next())
{
testInfo tmp;
tmp.id = pQuery->value("id").toInt();
tmp.userName = pQuery->value("user_name").toString();
tmp.ip = pQuery->value("ip").toString();
tmp.port = pQuery->value("port").toString();
tmp.password = pQuery->value("password").toString();
m_infoVect.push_back(tmp);
}
以上操作就把查询到的数据拿到本地内存中了,如果时测试可以打印出来看下这些数据。
for (int i=0;i<m_infoVect.size();i++)
{
qDebug() << m_infoVect[i].id << ":"
<< m_infoVect[i].userName << ":"
<< m_infoVect[i].ip << ":"
<< m_infoVect[i].port << ":"
<< m_infoVect[i].password ;
}
总结,以上是sqlite的简单操作,希望有所帮助!