QT 操作QSQLITE資料庫 音樂播放器準備篇
在音樂播放器中涉及到的主要的資料庫操作:
在.pro檔案中加入
QT += sql
qsql.h檔案:
#ifndef QSQL_H #define QSQL_H #include <QSqlDriver> #include <QSqlRecord> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlError> #include <mp3taglib.h> #include <QMainWindow> class SongDataBase; class SongDataBase { public: SongDataBase(); void creatSQL(); void creatTabel(QString *sqlCommand,const char *tableName); void insertInfo(MP3INFO *info, QString *tablename, int id); MP3INFO selectInfo(int index); void deleteInfo(QString *tablename); int returnCount(QString *tablename); QSqlDatabase m_database; }; #endif // QSQL_H
qsql.cpp檔案
一、初始化
1.1:判斷是否存在資料庫某個資料庫連結
QSqlDatabase::contains("qt_sql_default_connection")
[static] bool QSqlDatabase::contains(const QString &connectionName = QLatin1String( defaultConnection ))
Returns true if the list of database connections contains connectionName; otherwise returns false.
Note: This function is thread-safe.
有該連結的話返回true,該方法是執行緒安全的;
1.2:新增資料庫連結,建立資料庫連結(前提是這個資料庫沒有被建立)
m_database = QSqlDatabase::addDatabase("QSQLITE","qt_sql_default_connection");
m_database.setDatabaseName("songDB.db");
adddatabase函式第二個引數可以是預設的,可以修改;
1.3:建立資料庫連結(資料庫已經存在)
m_database = QSqlDatabase::database("qt_sql_default_connection");
1.4、判斷資料庫是否被開啟
if (!m_database.open())
{
qDebug() << "Error: Failed to connect database." << m_database.lastError();
}
1.5、建構函式的完整程式碼
SongDataBase::SongDataBase()
{
if (QSqlDatabase::contains("qt_sql_default_connection")) //"qt_sql_default_connection"
{
m_database = QSqlDatabase::database("qt_sql_default_connection");
}
else
{
m_database = QSqlDatabase::addDatabase("QSQLITE");
m_database.setDatabaseName("songDB.db");
}
if (!m_database.open())
{
qDebug() << "Error: Failed to connect database." << m_database.lastError();
}
}
二、表格操作
2.1、判斷表格是否存在
QSqlQuery song_query(m_database);
qDebug() << "Succeed to connect database." ;
QString isTableExist = QString("select count(*) from sqlite_master where type='table' and name='%1'").arg("song");
song_query.exec(isTableExist);
song_query.next();
if(song_query.value(0).toInt()==0) //表不存在
QSqlQuery類:提供一種執行SQL資料庫操作的方法
將SQL語句用QString儲存後,通過exec方法發射到資料庫
.arg()方法可以將QString字串內的%1替換為"song",當然也按順序可以替換多個%1,%2,%3...
當 song_query.value(0).toint()==0時表示表格不存在
2.2、建立表格
QString create_sql = "create table song (id int primary key, name varchar(30), singer varchar(30), album varchar(30), picurl varchar(30),url varchar(30), beginnum int ,lenth int)";
song_query.prepare(create_sql);
if(!song_query.exec())
{
qDebug() << "Error: Fail to create table." << song_query.lastError();
}
else
{
qDebug() << "song Table created!";
}
建立名為song的表格;
2.3、creatSQL()完整程式碼
功能:建立了用於儲存本地音樂資訊的表格song,和儲存我的最愛音樂資訊的表格faverate
void SongDataBase::creatSQL()
{
QSqlQuery song_query(m_database);
qDebug() << "Succeed to connect database." ;
QString isTableExist = QString("select count(*) from sqlite_master where type='table' and name='%1'").arg("song");
song_query.exec(isTableExist);
song_query.next();
if(song_query.value(0).toInt()==0) //表不存在,建立song表
{
qDebug()<<"table no exist";
QString create_sql = "create table song (id int primary key, name varchar(30), singer varchar(30), album varchar(30), picurl varchar(30),url varchar(30), beginnum int ,lenth int)";
song_query.prepare(create_sql);
if(!song_query.exec())
{
qDebug() << "Error: Fail to create table." << song_query.lastError();
}
else
{
qDebug() << "song Table created!";
}
}
QString TableExist = QString("select count(*) from sqlite_master where type='table' and name='%1'").arg("faverate");
song_query.exec(TableExist);
song_query.next();
if(song_query.value(0).toInt()==0) //表不存在,建立faverate表
{
qDebug()<<"faverate table no exist";
QString create_sql = "create table faverate (id int primary key, name varchar(30), singer varchar(30), album varchar(30), picurl varchar(30),url varchar(30), beginnum int ,lenth int)";
song_query.prepare(create_sql);
if(!song_query.exec())
{
qDebug() << "Error: Fail to create table." << song_query.lastError();
}
else
{
qDebug() << "faverate Table created!";
}
}
}
三、插入資料
3.1、prepare()方法
bool QSqlQuery::prepare(const QString &query)
Prepares the SQL query query for execution. Returns true if the query is prepared successfully; otherwise returns false.
在發射SQL命令之前,通過這個方法可以檢查發射的命令是否有問題,返回true或false
3.2、插入資料的函式完整程式碼
void SongDataBase::insertInfo(MP3INFO *info, QString *tablename,int id)
{
QSqlQuery song_query;
QString insert_sql = "insert into ";
insert_sql+=*tablename;
insert_sql+=" values (?, ?, ?, ?, ?, ?, ?, ?)";
song_query.prepare(insert_sql);
song_query.addBindValue(id);
song_query.addBindValue(info->Name);
song_query.addBindValue(info->Singer);
song_query.addBindValue(info->Album);
song_query.addBindValue(info->Picture_url);
song_query.addBindValue(info->Url);
song_query.addBindValue(info->beginNum);
song_query.addBindValue(info->lenth);
if(!song_query.exec())
{
qDebug() << "insert error: "<<song_query.lastError();
}
else
{
qDebug() << "inserted Wang!";
}
}
其中,表格內一行有多少列資料,value()內就有多少個問號,完整的sql程式碼應該是:"insert into tablename value()"
只不過我封裝成了可以替換表格名字而已
addBindValue()按順序將問號替換成資料
替換完成後,發射song_query.exec()
四、提取資料
4.1、對應sqlite程式碼
"select id, name, singer, album, picurl, url, beginnum, lenth from song limit "
如果limit後面接上範圍10,15,即select xx from xx limit 10,15,表示提取第10到15行的資料,如果什麼都不接,則提取所有行,如果只接10,則提取第十行資料
4.2、完整程式碼
MP3INFO SongDataBase::selectInfo(int index)
{
QSqlQuery song_query;
MP3INFO temp_info;
QString number = QString::number(index,10);
QString select_sql = "select id, name, singer, album, picurl, url, beginnum, lenth from song limit ";
select_sql+=number;
if(!song_query.exec(select_sql))
{
qDebug()<<song_query.lastError();
}
else
{
while(song_query.next())
{
temp_info.number = song_query.value(0).toInt();
temp_info.Name = song_query.value(1).toString();
temp_info.Singer = song_query.value(2).toString();
temp_info.Album = song_query.value(3).toString();
temp_info.Picture_url = song_query.value(4).toString();
temp_info.Url = song_query.value(5).toString();
temp_info.beginNum = song_query.value(6).toInt();
temp_info.lenth = song_query.value(7).toInt();
}
}
return temp_info;
}
將提取的資料放入一個MP3INFO結構體中,返回
五、刪除整個表格
5.1、sqlite對應程式碼
delete from xxx
5.2、完整程式碼
void SongDataBase::deleteInfo(QString *tablename)
{
QString clear_sql = "delete from ";
clear_sql+=*tablename;
QSqlQuery song_query;
song_query.prepare(clear_sql);
if(!song_query.exec())
{
qDebug() << song_query.lastError();
}
else
{
qDebug() << "table cleared";
}
}
六、獲得表格的行數
通過提取表格資料的方法改進得到的,就是遍歷每行,然後返回行數
完整程式碼:
int SongDataBase::returnCount(QString *tablename)
{
int count = 0;
QSqlQuery song_query;
QString select_sql = "select id, name, singer, album, picurl, url, beginnum, lenth from ";
select_sql+=*tablename;
if(!song_query.exec(select_sql))
{
qDebug()<<song_query.lastError();
}
else
{
while(song_query.next())
{
count+=1;
}
}
qDebug()<<"sql count:"<<count;
return count;
}