Sqlite数据库作为Qt项目开发中经常使用的一个轻量级的数据库,可以说是兼容性相对比较好的数据库之一(Sqlite就像Qt的亲儿子,如同微软兼容Access数据库一样)。关于Sqlite和Qt的千丝万缕的故事,有机会再说(各位看官查一查也可以自己search一下)。这里简单说说Sqlite数据库的用法吧。
一、sql语句和部分接口函数
1、在.pro文件中记得增加 :
QT += core gui sql
2、sqlite数据库的增删查改【接口函数参见代码】
-
#ifndef SQLITEDBAOPERATOR_H
-
#define SQLITEDBAOPERATOR_H
-
#include"generalheaders.h"
-
#include <QSqlDatabase>
-
#include <QSqlQuery>
-
#include <QSqlQueryModel>
-
#include <QDebug>
-
#include <QSqlError>
-
class SqliteDBAOperator
-
{
-
public:
-
SqliteDBAOperator();
-
~SqliteDBAOperator();
-
public:
-
//创建数据库并建立连接
-
bool OpenDb(void);
-
//创建数据表(student)
-
void createTable(void);
-
//在表格中增加新的字段
-
void addNewcolumn(QString &columnNameAndproperty);
-
//查询和显示结果
-
void queryTable(QString& str);
-
//判断数据表是否存在
-
bool IsTaBexists(QString& Tabname);
-
//插入数据
-
void singleinsertdata(w2dba &singledb);//插入单条数据
-
void Moreinsertdata(QList<w2dba> &moredb);//插入多条数据
-
//删除数据
-
void deletedata();
-
//修改数据
-
void updatedata();
-
//关闭数据库
-
void closeDb(void);
-
private:
-
QSqlDatabase db;//用于建立和数据库的连接
-
};
-
#endif // SQLITEDBAOPERATOR_H
这里w2dba 是自己定义的一个结构体类型的数据。各位可以根据自己实际需要修改。 因为c++开发面向对象的思想,所以我个人通常是在确定一个对象后,再思考这个对象的衣食住行、拉屎放屁、能够公开交流的、或者只能私有的都有哪些东西,接着根据这个对象的应有的特点,编写对应的函数尽量让这个对象鲜活饱满,但是春光不会外泄出来(==》纯属小弟个人微不足道的理解,不喜勿喷。更多精彩画面,自行脑补)。
-
/*Sqlite数据库操作*/
-
#include "sqlitedbaoperator.h"
-
#include"generalheaders.h"
/*构造函数中初始化数据库对象,并创建连接*/
-
SqliteDBAOperator::SqliteDBAOperator()
-
{
-
QSqlDatabase database;
-
if (QSqlDatabase::contains("qt_sql_default_connection"))
-
{
-
database = QSqlDatabase::database("qt_sql_default_connection");
-
}
-
else
-
{
-
//建立和sqlite数据的连接
-
db = QSqlDatabase::addDatabase("QSQLITE");
-
//设置数据库文件的名字
-
QString dbname = QDir::currentPath() +QString("/")+ QString("MACAddrs.db");
-
db.setDatabaseName(dbname);
-
}
-
}
-
/*析构函数关闭数据库连接*/
-
SqliteDBAOperator::~SqliteDBAOperator()
-
{
-
db.close();
-
}
-
//打开数据库
-
bool SqliteDBAOperator::OpenDb(void)
-
{
-
//打开数据库
-
if(db.open() == false){
-
qDebug() << "连接数据失败!";
-
return false;
-
}
-
qDebug() << "连接数据库成功";
-
return true;
-
}
-
//判断数据库中某个数据表是否存在
-
bool SqliteDBAOperator::IsTaBexists(QString& Tabname)
-
{
-
QSqlDatabase db = QSqlDatabase::database();
-
if(db.tables().contains(Tabname))
-
{
-
return true;
-
}
-
return false;
-
}
-
//创建数据表
-
void SqliteDBAOperator::createTable(void)
-
{
-
//用于执行sql语句的对象
-
QSqlQuery query;
-
//构建创建数据库的sql语句字符串
-
QString str = QString("CREATE TABLE MACAddrs (\
-
ID INT PRIMARY KEY NOT NULL,\
-
Type TEXT NOT NULL,\
-
ProduceTime TEXT NOT NULL)");
-
//执行sql语句
-
query.exec(str);
-
}
-
void SqliteDBAOperator::addNewcolumn(QString& columnNameAndproperty)
-
{
-
}
-
//查询和显示结果
-
void SqliteDBAOperator::queryTable(QString& str)
-
{
-
QSqlQuery query;
-
//构建创建数据库的sql语句字符串
-
str = QString("SELECT ID,Type,MACADDR FROM MACAddrs");
-
//执行sql语句,并将结果集保存到model
-
query.exec(str);
-
}
-
//单条插入
-
void SqliteDBAOperator::singleinsertdata(w2dba &singledb)
-
{
-
QSqlQuery query;
-
query.prepare("INSERT INTO MACAddrs VALUES (:ID,:Type,:ProduceTime)");
-
query.bindValue(":ID", singledb.id);
-
query.bindValue(":Type", singledb.type);
-
query.bindValue(":ProduceTime",singledb.prodceTime);
-
query.exec();
-
}
-
//多条插入
-
void SqliteDBAOperator::Moreinsertdata(QList<w2dba>& moredb)
-
{
-
QSqlQuery query;
-
query.prepare("insert into MACAddrs values (?,?,?,?,?,?,?,?)");
-
QVariantList idlist,snlist,typelist,MACAddrlsit,produceTimelist,Pieceslist,Operatorlist,OperateStatlist;
-
for(int i=0; i< moredb.size(); i++)
-
{
-
idlist << moredb.at(i).id;
-
typelist << moredb.at(i).type;
-
produceTimelist << moredb.at(i).prodceTime;
-
}
-
query.addBindValue(idlist);
-
query.addBindValue(MACAddrlsit);
-
query.addBindValue(produceTimelist);
-
if (!query.execBatch())
-
{
-
qDebug() << query.lastError();
-
}
-
}
-
//删除一条数据
-
void SqliteDBAOperator::deletedata()
-
{
-
//比较简单,自行补充
-
}
-
//修改
-
void SqliteDBAOperator::updatedata()
-
{
-
//比较简单,自行补充
-
}
-
void SqliteDBAOperator::closeDb(void)
-
{
-
db.close();
-
}
这部分可能稍微有点意思的就是带参SQL语句的编写,在数据的单条插入和多条插入中,使用了两种不同的方法,各位可以自行查看。
二、接口函数的检测
1、windows下sqlite数据库的安装:
(1) 前往www.sqlite.org.com下载相应的数据库文件,然后在创建路径并在 c:\sqilte3 路径下将文件解压(路径可自己定义);
(2)设置环境变量,将数据库路的路径增加到PATH变量下。
(3)环境配置完成,重启电脑,配置生效。
(4)数据库操作
1>创建或打开数据库
通过cd 命令到.db数据库文件所在的目录下,如果没有文件自己创建一个。
这里在C盘的根目录下创建一个test.db的数据库文件
敲击回车后进入sqlite数据库,显示如下:
(2)前面简单的数据库基本配置工作已经完成,现在开始数据库的操作部分
首先,我们要创建一张数据表:
sql语句:
CREATE TABLE MACAddrs ( ID INT PRIMARY KEY NOT NULL,Type TEXT NOT NULL,ProduceTime TEXT );
查看表格是否创建成功 以及表头内容:
.tables
.schema
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("test.db");
bool ok = db.open();
if (ok == true)
{
QSqlQuery query;
query.exec("SELECT * from info");
QString string;
while (query.next())
{
QString id = query.value(0).toString();
qDebug() < string += id + "\n";
QString name = query.value(1).toString();
string += name + "\n";
}
qDebug() < ui->TextEdit->setText(string);
}
else
{
QMessageBox::information(this, "ERROR", "open database error");
}
db.close();
}
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("test.db");
bool ok = db.open();
if (ok == true)
{
QSqlQuery query;
query.prepare("INSERT INTO info (id, name) "
"VALUES (:id, :name)");
query.bindValue(":id", ui->IdEdit->text().toInt());
query.bindValue(":name", ui->NameEdit->text());
query.exec();
ui->IdEdit->clear();
ui->NameEdit->clear();
this->on_QueryButton_clicked();
}
else
{
QMessageBox::information(this, "ERROR", "open database error");
}
db.close();
}
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("test.db");
bool ok = db.open();
if (ok == true)
{
QSqlQuery query;
QString command="DELETE FROM info WHERE ";
if (ui->IdEdit->text().isEmpty() == false)
{
command.append("id="+ui->IdEdit->text());
query.exec(command);
}
else if (ui->NameEdit->text().isEmpty() == false)
{
command +="name=\'" + ui->NameEdit->text() + "\'";
qDebug()< query.exec(command);
}
else
{
QMessageBox::information(this, "ERROR", "open database ok! delete error");
}
ui->IdEdit->clear();
ui->NameEdit->clear();
this->on_QueryButton_clicked();
}
else
{
QMessageBox::information(this, "ERROR", "open database error");
}
db.close();
}
来源:oschina
链接:https://my.oschina.net/u/4340499/blog/4503359