1. 程式人生 > >QT 操作QSQLITE資料庫 音樂播放器準備篇

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;
}