Qt下Sqlite数据库操作
?Sqlite數(shù)據(jù)庫作為Qt項目開發(fā)中經(jīng)常使用的一個輕量級的數(shù)據(jù)庫,可以說是兼容性相對比較好的數(shù)據(jù)庫之一(Sqlite就像Qt的親兒子,如同微軟兼容Access數(shù)據(jù)庫一樣)。關于Sqlite和Qt的千絲萬縷的故事,有機會再說(各位看官查一查也可以自己search一下)。這里簡單說說Sqlite數(shù)據(jù)庫的用法吧。
一、sql語句和部分接口函數(shù)
1、在.pro文件中記得增加 :
QT += core gui sql ?2、sqlite數(shù)據(jù)庫的增刪查改【接口函數(shù)參見代碼】
#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:
//創(chuàng)建數(shù)據(jù)庫并建立連接
bool OpenDb(void);
//創(chuàng)建數(shù)據(jù)表(student)
void createTable(void);
//在表格中增加新的字段
void addNewcolumn(QString &columnNameAndproperty);
//查詢和顯示結(jié)果
void queryTable(QString& str);
//判斷數(shù)據(jù)表是否存在
bool IsTaBexists(QString& Tabname);
//插入數(shù)據(jù)
void singleinsertdata(w2dba &singledb);//插入單條數(shù)據(jù)
void Moreinsertdata(QList<w2dba> &moredb);//插入多條數(shù)據(jù)
//刪除數(shù)據(jù)
void deletedata();
//修改數(shù)據(jù)
void updatedata();
//關閉數(shù)據(jù)庫
void closeDb(void);
private:
QSqlDatabase db;//用于建立和數(shù)據(jù)庫的連接
};
#endif // SQLITEDBAOPERATOR_H
這里w2dba 是自己定義的一個結(jié)構(gòu)體類型的數(shù)據(jù)。各位可以根據(jù)自己實際需要修改。 因為c++開發(fā)面向?qū)ο蟮乃枷?#xff0c;所以我個人通常是在確定一個對象后,再思考這個對象的衣食住行、拉屎放屁、能夠公開交流的、或者只能私有的都有哪些東西,接著根據(jù)這個對象的應有的特點,編寫對應的函數(shù)盡量讓這個對象鮮活飽滿,但是春光不會外泄出來(==》純屬小弟個人微不足道的理解,不喜勿噴。更多精彩畫面,自行腦補)。
?
/*Sqlite數(shù)據(jù)庫操作*/
#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數(shù)據(jù)的連接
db = QSqlDatabase::addDatabase("QSQLITE");
//設置數(shù)據(jù)庫文件的名字
QString dbname = QDir::currentPath() +QString("/")+ QString("MACAddrs.db");
db.setDatabaseName(dbname);
}
}
/*析構(gòu)函數(shù)關閉數(shù)據(jù)庫連接*/
SqliteDBAOperator::~SqliteDBAOperator()
{
db.close();
}
//打開數(shù)據(jù)庫
bool SqliteDBAOperator::OpenDb(void)
{
//打開數(shù)據(jù)庫
if(db.open() == false){
qDebug() << "連接數(shù)據(jù)失敗!";
return false;
}
qDebug() << "連接數(shù)據(jù)庫成功";
return true;
}
//判斷數(shù)據(jù)庫中某個數(shù)據(jù)表是否存在
bool SqliteDBAOperator::IsTaBexists(QString& Tabname)
{
QSqlDatabase db = QSqlDatabase::database();
if(db.tables().contains(Tabname))
{
return true;
}
return false;
}
//創(chuàng)建數(shù)據(jù)表
void SqliteDBAOperator::createTable(void)
{
//用于執(zhí)行sql語句的對象
QSqlQuery query;
//構(gòu)建創(chuàng)建數(shù)據(jù)庫的sql語句字符串
QString str = QString("CREATE TABLE MACAddrs (\
ID INT PRIMARY KEY NOT NULL,\
Type TEXT NOT NULL,\
ProduceTime TEXT NOT NULL)");
//執(zhí)行sql語句
query.exec(str);
}
void SqliteDBAOperator::addNewcolumn(QString& columnNameAndproperty)
{
}
//查詢和顯示結(jié)果
void SqliteDBAOperator::queryTable(QString& str)
{
QSqlQuery query;
//構(gòu)建創(chuàng)建數(shù)據(jù)庫的sql語句字符串
str = QString("SELECT ID,Type,MACADDR FROM MACAddrs");
//執(zhí)行sql語句,并將結(jié)果集保存到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();
}
}
//刪除一條數(shù)據(jù)
void SqliteDBAOperator::deletedata()
{
//比較簡單,自行補充
}
//修改
void SqliteDBAOperator::updatedata()
{
//比較簡單,自行補充
}
void SqliteDBAOperator::closeDb(void)
{
db.close();
}
這部分可能稍微有點意思的就是帶參SQL語句的編寫,在數(shù)據(jù)的單條插入和多條插入中,使用了兩種不同的方法,各位可以自行查看。
?
二、接口函數(shù)的檢測
1、windows下sqlite數(shù)據(jù)庫的安裝:
? ?(1) 前往www.sqlite.org.com下載相應的數(shù)據(jù)庫文件,然后在創(chuàng)建路徑并在 c:\sqilte3 路徑下將文件解壓(路徑可自己定義);
(2)設置環(huán)境變量,將數(shù)據(jù)庫路的路徑增加到PATH變量下。
?
(3)環(huán)境配置完成,重啟電腦,配置生效。
(4)數(shù)據(jù)庫操作
? ? 1>創(chuàng)建或打開數(shù)據(jù)庫
通過cd 命令到.db數(shù)據(jù)庫文件所在的目錄下,如果沒有文件自己創(chuàng)建一個。
這里在C盤的根目錄下創(chuàng)建一個test.db的數(shù)據(jù)庫文件
敲擊回車后進入sqlite數(shù)據(jù)庫,顯示如下:
(2)前面簡單的數(shù)據(jù)庫基本配置工作已經(jīng)完成,現(xiàn)在開始數(shù)據(jù)庫的操作部分
首先,我們要創(chuàng)建一張數(shù)據(jù)表:
sql語句:
?
CREATE TABLE MACAddrs ( ID INT PRIMARY KEY NOT NULL,Type TEXT NOT NULL,ProduceTime TEXT );?
查看表格是否創(chuàng)建成功 以及表頭內(nèi)容:
.tables
.schema
QT實現(xiàn)對sqlite數(shù)據(jù)庫的操作
先看下效果圖: http://blog.chinaunix.net/photo/116111_101004185238.jpg 該程序?qū)?shù)據(jù)庫的操作包括4個字段:ID、Name、Addr、Nick? (注意第一個字段必須是整數(shù)) query、insert、delete按鈕分別表示查詢、插入、刪除功能 ? 查詢按鈕的實現(xiàn): void database::on_QueryButton_clicked(){
??? 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();
} 插入按鈕的實現(xiàn): void database::on_InsertButton_clicked()
{
??? 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();
} ? 刪除按鈕的實現(xiàn): void database::on_DeleteButton_clicked()
{
??? 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();
}
?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Qt下Sqlite数据库操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决跨域问题:No ‘Access-Co
- 下一篇: qt中数据库操作总结