尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【基于Qt5仿音乐播放器(五)】——数据持久化
【基于Qt5仿音乐播放器五】——数据持久化1. 数据库初始化2. 歌曲信息写入数据库3. 从数据库中读取支持播放相关功能之后每次在验证功能时都需要从磁盘中加载歌曲文件非常的麻烦。而且之前收藏的喜欢歌曲以及播放记录在程序关闭之后就没有了。因此需要将每次在播放器上进行的操作保留下来比如所加载的歌曲、以及歌曲信息收藏歌曲信息历史播放等信息保存起来当下次程序启动时将保存的信息加载到播放器即可这样就能将在播放器上的操作记录保留下来了。要永久性保存最简单的方式就是直接保存到文件但是保存文件不安全而且需要自己操作文件比较麻烦所以我们数据库完成信息的持久保存。我们采用到了Qt中内置的数据库SQLit——点击转入文章1. 数据库初始化// widget.h中新增voidinitSql();private:QSqlDatabase sqlite;// widget.cpp中新增voidWidget::initSql(){sqliteQSqlDatabase::addDatabase(QSQLITE);sqlite.setDatabaseName(QQMusic.db);// 打开数据库if(!sqlite.open()){QMessageBox::critical(this,打开数据库失败,sqlite.lastError().text());qDebug()打开数据库失败;return;}qDebug()创建数据库成功;// 创建表QStringsql(CREATE TABLE IF NOT EXISTS musicInfo(\ id INTEGER PRIMARY KEY AUTOINCREMENT,\ musicId varchar(200) UNIQUE,\ musicName varchar(50),\ musicSinger varchar(50),\ albumName varchar(50),\ duration BIGINT,\ musicUrl varchar(256),\ isLike INTEGER,\ isHistory INTEGER));QSqlQuery query;if(!query.exec(sql)){QMessageBox::critical(this,打开数据库失败,query.lastError().text());return;}qDebug()创建musicInfo表成功;}2. 歌曲信息写入数据库// musiclist.h 中新增// 所有歌曲信息更新到数据库voidwriteToDB();// musiclist.cpp 中新增voidMusicList::writeToDB(){for(automusic:musicList){// 让music对象将⾃⼰写⼊数据库music.insertMusicToDB();}}// music.h 中新增// 将当前Music对象更新到数据库voidinsertMusicToDB();// music.cpp 中新增voidMusic::insertMusicToDB(){QSqlQuery query;// 查看数据库中是否有该音乐query.prepare(select exists (select 1 from musicInfo where musicId ?));query.addBindValue(musicId);if(!query.exec()){qDebug()查询失败query.lastError().text();return;}// 获取查询结果if(query.next()){boolisExitquery.value(0).toBool();if(isExit){// 存在只需要更新isLike和isHistoryquery.prepare(update musicInfo set isLike ?, isHistory ? where musicId ?);query.addBindValue(isLike?1:0);query.addBindValue(isHistory?1:0);query.addBindValue(musicId);if(!query.exec()){qDebug()更新失败query.lastError().text();return;}qDebug()更新music信息: musicName musicId;}else{// 不存在query.prepare(INSERT INTO MusicInfo(musicId, musicName, \ musicSinger, albumName, musicUrl,\ duration, isLike, isHistory)\ VALUES(?,?,?,?,?,?,?,?));query.addBindValue(musicId);query.addBindValue(musicName);query.addBindValue(musicSinger);query.addBindValue(musicAlbum);query.addBindValue(musicUrl.toLocalFile());query.addBindValue(duration);query.addBindValue(isLike?1:0);query.addBindValue(isHistory?1:0);if(!query.exec()){qDebug()插⼊失败: query.lastError().text();return;}qDebug()插⼊music信息: musicName musicId;}}}//widget.cpp中新增voidWidget::on_quit_clicked(){// 写入数据musicList.writeToDB();// 关闭数据库sqlite.close();// 退出this-close();}3. 从数据库中读取在程序启动时从数据库中读取到歌曲的信息将歌曲信息设置到musicList中然后让likePage、localPage、recentPage将musicList中个歌曲更新到各自页面中。从数据库读取歌曲数据的操作应该让MusicList类完成因为该类管理所有的Music对象。// musiclist.h 中新增voidreadFromDB();// musiclist.cpp 中新增voidMusicList::readFromDB(){QStringsql(SELECT musicId, musicName, musicSinger, albumName,\ duration, musicUrl, isLike, isHistory \ FROM musicInfo);QSqlQuery query;if(!query.exec(sql)){qDebug()数据库查询失败;return;}// 获取结果while(query.next()){Music music;music.setMusicId(query.value(0).toString());music.setMusicName(query.value(1).toString());music.setMusicSinger(query.value(2).toString());music.setMusicAlbum(query.value(3).toString());music.setMusicDuration(query.value(4).toLongLong());music.setMusicUrl(file:///query.value(5).toString());music.setIsLike(query.value(6).toBool());music.setIsHistory(query.value(7).toBool());musicList.push_back(music);musicPaths.insert(music.getMusicUrl().toLocalFile());}}// widget.h中新增voidinitMusicList();// widget.cpp中新增voidWidget::initMusicList(){musicList.readFromDB();// 这里将原来在initUI中的设置页面类型移至此处ui-likePage-setPageType(PageType::LIKE_PAGE);ui-likePage-reFresh(musicList);ui-localPabe-setPageType(PageType::LOCAL_PAGE);ui-localPabe-reFresh(musicList);ui-recentPage-setPageType(PageType::HISTORY_PAGE);ui-recentPage-reFresh(musicList);}
RELATED

相关推荐

从野蛮生长到合规深耕:储能行业新标闭环,重塑全产业链安全逻辑,捷思特解决方案赋能产业升级!

从野蛮生长到合规深耕:储能行业新标闭环,重塑全产业链安全逻辑,捷思特解决方案赋能产业升级!

2026年7月1日,储能行业迎来了一场地震。不是某项技术突破,不是某个巨头入局,而是三份文件在同一天同时生效——GB/T 46957-2025《电力储能系统并网储能系统安全通用规范》、T/CFPA 055-2026《电化学储能电站防火设计导则》、发改委第41号令《…

📅 2026/10/25 1:39:08
7月新国标推动汽车电子产线升级 || 新能源汽车安全门槛更严格,老化检测成关键变量!

7月新国标推动汽车电子产线升级 || 新能源汽车安全门槛更严格,老化检测成关键变量!

2026年7月1日,两项强制性国家标准同步实施:《电动汽车用动力蓄电池安全要求》(GB 38031-2025)和《电动汽车安全要求》(GB 18384-2025)。这不是推荐性指引,是强制执行的法律底线。新申报车型必须…

📅 2026/10/25 1:39:08
工业电源单元的测试自动化发展方向,如何判断是否该引用设备?

工业电源单元的测试自动化发展方向,如何判断是否该引用设备?

电源单元出3%的现场故障率,意味着25%的重复业务流失。在纺织行业,单个电源单元故障,每小时损失以百万美元计。这个数字不是危言耸听,数控机床、机器人装配线、SCADA系统、数据中心机架,所有这些东西的背后,…

📅 2026/10/25 1:39:08
MORE NEWS

更多资讯

📰

使用srvany.exe将普通程序转为Windows服务的完整指南

1. 为什么需要srvany.exe创建Windows服务在Windows系统中,许多后台程序需要以服务形式运行才能实现开机自启、崩溃重启等关键功能。但并非所有程序都原生支持服务化运行,这时候srvany.exe就派上了用场。srvany是Windows Server Resource Kit工具包中的一…

📰

Mac软件卸载全指南:从基础到深度清理

1. Mac软件卸载的常见误区与正确认知作为一位使用Mac超过十年的老用户,我见过太多人用错误的方式卸载软件。最常见的就是直接把应用图标拖到废纸篓——这种方式看似简单,但实际上只删除了主程序文件,留下了大量系统垃圾。macOS的应用程序采用…

📰

二叉树数据结构:原理、实现与应用全解析

1. 二叉树的基本概念与特性二叉树是每个节点最多只有两个子节点的树形数据结构,这种结构在计算机科学中有着广泛的应用场景。从操作系统内核到数据库索引,从编译器语法分析到游戏场景管理,二叉树的身影无处不在。1.1 二叉树的数学定义严格来说…

📰

企业知识管理工具进化:从IMA到Pandawiki的实践指南

1. 为什么说"ima已死"?企业知识管理工具的迭代逻辑2015年前后,ima作为早期企业知识库解决方案的代表,确实解决了不少企业的文档集中管理需求。但站在2024年的视角回看,这套系统存在三个致命伤:首先是架构层面…

📰

Transformer代码包实战解析:英德翻译与模型训练

简介:AISTransformer数据代码详解是一份聚焦人工智能与机器学习数据预处理的源码型资源,定位为软件/插件类工具,面向算法工程师、数据工程师以及希望掌握数据清洗、特征工程与格式转换的开发者,核心目标是提升数据准备阶段的效率与…

📰

OpenCV 4.5.5工业部署指南:DNN一致性、编译避坑与静态SDK封装

简介:本资源为OpenCV 4.5.5官方版本预编译完成的C动态库分发包,面向计算机视觉初学者、算法工程师及嵌入式开发人员,有效解决手动编译OpenCV耗时长、环境依赖复杂、易出错等痛点,开箱即用,显著降低项目集成门槛。压缩包…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬