Qt下Sqlite数据库操作
?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
QT實現對sqlite數據庫的操作
先看下效果圖: http://blog.chinaunix.net/photo/116111_101004185238.jpg 該程序對數據庫的操作包括4個字段:ID、Name、Addr、Nick? (注意第一個字段必須是整數) query、insert、delete按鈕分別表示查詢、插入、刪除功能 ? 查詢按鈕的實現: 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();
} 插入按鈕的實現: 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();
} ? 刪除按鈕的實現: 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();
}
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Qt下Sqlite数据库操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解决跨域问题:No ‘Access-Co
- 下一篇: qt中数据库操作总结