Qt仿音乐播放器:数据库持久化

一、铺垫

本地的数据持久化选择的是SQLite;他的头文件及准备文件只有100兆左右;它形成的数据库通常只有几兆大小;适合于单片机嵌入式开发;

而且Qt是支持SQLite的,也就是说,只需要在核心文件中加一个拓展名,就可以解决;

二、套路

复制代码
#include<QSqlDatabase>        //头文件
#include<QSqlQuery>
QSqlDatabase sqLite = QSqlDatabase::addDatabase("QSQLITE"); //创建数据库类sqLite.setDatabaseName("music.db");        //设置要链接的数据库名称   
//3.打开数据库    
if(!sqLite.open()){ 
        QMessageBox::critical(this,"MiniMusic","数据库打开失败");        
        return;            
}    
qDebug()<<"数据库连接成功";
//4.创建表
QString sql = "CREATE TABLE IF NOT EXISTS MusicInfo(\
                id INTEGER PRIMARY KEY AUTOINCREMENT,\
                musicId VARCHAR(50) UNIQUE,\
                musicName VARCHAR(50),\               
                musicSinger VARCHAR(50),\
                albumName VARCHAR(50),\
                musicUrl VARCHAR(256),\
                duration BIGINT,\
                isLike INTEGER,\
                isHistory INTEGER)";
QSqlQuery query;
if(!query.exec(sql)){
        QMessageBox::critical(this,"MiniMusic","初始化错误");
        return;
        }        
qDebug()<<"表创建成功";

三、头文件类的说明

The QSqlQuery class provides a means of executing and manipulating SQL statements.

//query:查询; execute:实施,执行; manipulate 操作,控制;

//此类提供了一中执行和操作SQL语句的方法

The QSqlDatabase class handles a connection to a database.

//此类处理数据库的链接;

四、对数据库的增删查改

其实本质上就是数据库的语句,只不过是怎加了一层封装;但是确实比刚开始学简单多了;我的音乐播放器暂时没有删除选项暂时没有写删除;

4.1增

复制代码
query.prepare("INSERT INTO MusicInfo(musicId,musicName,musicSinger,albumName,musicUrl,\
                      duration,isLike,isHistory) VALUES(?,?,?,?,?,?,?,?)");
query.bindValue(0,musicId);
query.bindValue(1,musicName);
query.bindValue(2,musicSinger);
query.bindValue(3,musicAlbumn);
query.bindValue(4,musicUrl.toLocalFile());
query.bindValue(5,duration);
query.bindValue(6,isLike?1:0);
query.bindValue(7,isHistory?1:0);
if(!query.exec()){
    qDebug()<<"插入失败"<<query.lastError().text();
    return;
}
qDebug()<<"更新歌曲信息:"<<musicName<<" "<<musicId;

4.2查、改

复制代码
QSqlQuery query;
query.prepare("SELECT EXISTS (SELECT 1 FROM MusicInfo WHERE musicId = ?)");//只返回id
query.bindValue(0,musicId);
if(!query.exec()){
   qDebug()<<"查询失败"<<query.lastError();
   return;
}
if(query.next())
    {
        bool isExists=query.value(0).toBool();
        if(isExists){
            //musicId歌曲已经存在
            //2.存在,不需要再插入music对象,此时,只需要将islike和ishistory属性更新
            query.prepare("UPDATE MusicInfo SET isLike=?,isHistory=? WHERE musicId =?");
            query.bindValue(0,isLike?1:0);
            query.bindValue(1,isHistory?1:0);
            query.bindValue(2,musicId);
            if(!query.exec()){
                qDebug()<<"更新信息失败"<<query.lastError().text();
                return;
            }
            qDebug()<<"更新歌曲信息:"<<musicName<<" "<<musicId;
        }
相关推荐
此生决int7 分钟前
深入理解C++系列(19)——C++11(上)
开发语言·c++
其实防守也摸鱼16 分钟前
堆叠注入(Stacked Injection)详解
服务器·数据库·windows·https·ssl
郝学胜-神的一滴20 分钟前
C++20模板元编程 05:吃透变参模板,解锁编译期万能参数能力
服务器·开发语言·c++·windows·vscode
两点王爷9 小时前
PostgreSQL 常用 SQL 语句与 GIS 相关函数详解
数据库·后端
两点王爷9 小时前
PostgreSQL 好用又独特的特性与空间函数
数据库
梦帮科技9 小时前
AI 音乐产品的发布工程:验证门、数据发布、回滚与生产运维纪律
数据结构·数据库·架构·node.js·音视频·动态规划·推荐算法
C++ 老炮儿的技术栈10 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
传奇开心果编程10 小时前
【Rust入门练中学】第2课:变量、可变性与常量
开发语言·学习·rust
TDengine (老段)10 小时前
TDengine 常见问题 TOP3
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
zr想努力10 小时前
从0开始配置Perforce4环境
开发语言