网盘——数据库操作

关于网盘的数据库模块,主要有以下几个内容:定义数据库操作类、将数据库操作类定义成单例模式、数据库操作

数据库是在Qt里面,定义成操作类,专门用这个类产生对象,对数据库实现操作,那么我们在产生对象的时候是把他定义为单例模式这样使用起来会比较方便,在这个函数中我们会对数据库进行各种操作,会把相应的函数操作封装到这个类里面,作为成员函数。

目录

1、准备工作——创建数据库

1.1、输入dir查看目录,所有的注册信息都是保存在服务器端(TcpServer)

1.2、在当前目录下面创建数据库

1.3、在数据库下面创建信息表:用户信息表,好友表

1.4、再添加一个判断是否登陆过,//默认是不在线的,加入在线登陆成功就将这个值置为1,如果在登陆的时候检测到这个值是1的话,就禁止重复登陆。

1.5、创建好友表,id可以对应多个好友,所以主键不可以用id,不能用单个id作为主键。在这里我们把id和friendId同时合成主键

1.6、查看创建表格

1.7、退出来

1.8、看一下目录下面有没有成功创建cloud.db

2、定义数据库操作类

 2.1、在TcpServer里面添加一个新文件,专门用来操作数据库,如果要支持信号槽的话,必须基类选择QObject

3、将数据库定义成单例模式

3.1、定义单例

A、这是一个静态的成员函数

B、通过类名直接来调用

3.2、连接数据库

A、连接数据库,要引用头文件,在operatedb.h里面添加头文件

B、查询数据库,在operatedb.h里面添加头文件

 C、定义成员函数,用来连接数据库

D、将数据库的连接写成一个初始化函数

E、在构造函数里面告诉QsqlDatabase我们要操作的数据库是一个什么数据库(sqlite)

F、按住Alt+enter,添加定义

a、连接数据库

b、需要操作的数据库的名字 ,这个要添加到资源文件

c、插入数据

G、打开数据库

H、调试

a、引入头文件

3.3、析构函数

A、创建析构函数

B、关掉数据库

3.3、运行测试


1、准备工作——创建数据库

在Window下面,按住Win+R,输入cmd,将目录切换到代码目录里面去

1.1、输入dir查看目录,所有的注册信息都是保存在服务器端(TcpServer)

1.2、在当前目录下面创建数据库

sqlite3 cloud.db

1.3、在数据库下面创建信息表:用户信息表,好友表

create table usrInfo(id integer primary key autoincrement,  name varchar(32) unique,pwd varchar(32));

1.4、再添加一个判断是否登陆过,//默认是不在线的,加入在线登陆成功就将这个值置为1,如果在登陆的时候检测到这个值是1的话,就禁止重复登陆。

alter table usrInfo add online integer default 0

1.5、创建好友表,id可以对应多个好友,所以主键不可以用id,不能用单个id作为主键。在这里我们把id和friendId同时合成主键

create table friend(id integer, friendId integer, primary key(id, friendId));

1.6、查看创建表格

.tables

1.7、退出来

.quit

1.8、看一下目录下面有没有成功创建cloud.db

创建成功,数据库已经有啦

2、定义数据库操作类

在服务器端创建数据库操作类

 2.1、在TcpServer里面添加一个新文件,专门用来操作数据库,如果要支持信号槽的话,必须基类选择QObject

3、将数据库定义成单例模式

不管在哪里想要用的时候,直接通过单例的对象就可以快速地使用

3.1、定义单例

就是把它定义一个静态的成员函数

//定义单例,就是把它定义成静态的成员函数,在静态成员函数里面,再定义一个静态的对象,每次通过类名调用静态成员函数的时候,使用静态的局部成员(局部变量),就可以使用到同一个对象。

A、这是一个静态的成员函数

static OperateDB& getInstance();

B、通过类名直接来调用

当我们通过类名调用getInstance的时候,都会返回静态对象的引用,因为他是静态的,所以每次调用都是用一个对象

OperateDB &OperateDB::getInstance()
{//在静态的成员函数里面,再定义一个静态的对象static OperateDB instance;//返回静态对象的引用return instance;
}

3.2、连接数据库

在Qt使用是数据库的时候,要使用到sql模块,在pro里面添加,将sql加载到这个项目文件中

A、连接数据库,要引用头文件,在operatedb.h里面添加头文件

#include <QtSql/QSqlDatabase>

B、查询数据库,在operatedb.h里面添加头文件

#include <QtSql/QSqlQuery>

 C、定义成员函数,用来连接数据库

private:QSqlDatabase m_db;

D、将数据库的连接写成一个初始化函数

  //将数据库的连接写成一个初始化函数void init();

E、在构造函数里面告诉QsqlDatabase我们要操作的数据库是一个什么数据库(sqlite)

OperateDB::OperateDB(QObject *parent) : QObject(parent)
{//在构造函数里面告诉QsqlDatabase我们要操作的数据库是一个什么数据库m_db = QSqlDatabase::addDatabase("QSQLITE");
}

F、按住Alt+enter,添加定义

a、连接数据库
//localhost本地,远程就写远程的ipm_db.setHostName("localhost");
b、需要操作的数据库的名字 ,这个要添加到资源文件

注意不要使用添加文件的方式,因为db文件可能加不上

 m_db.setDatabaseName("F:\\Documents\\Desktop\\wangpan\\TcpServer\\cloud.db");
c、插入数据
insert into usrInfo(name, pwd) values ('jack', 'jack'), ('rose', 'rose'), ('lucy', 'lucy');

G、打开数据库

打开成功则输出数据库内容,失败则弹出Box提示打开数据库失败

if(m_db.open()){//成功——查询数据QSqlQuery query;query.exec("select * from usrInfo");while (query.next()) {QString data = QString("%1,%2,%3").arg(query.value(0).toString()).arg(query.value(1).toString()).arg(query.value(2).toString());qDebug()<<data;}}else {QMessageBox::critical(NULL,"打开数据库","打开数据库失败");}

H、调试

打开main.cpp

a、引入头文件
#include "operatedb.h"
OperateDB::getInstance().init();

main.cpp的完整代码 

#include "tcpserver.h"#include <QApplication>
#include "operatedb.h"
int main(int argc, char *argv[])
{QApplication a(argc, argv);//关于数据库的测试OperateDB::getInstance().init();//    TcpServer w;//    w.show();return a.exec();
}

3.3、析构函数

A、创建析构函数

~OperateDB();

B、关掉数据库

OperateDB::~OperateDB()
{//关掉数据库m_db.close();
}

3.3、运行测试

成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/768457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BMS设计中的短路保护和MOSFET选型(下)

二、MOSFET参数 1、电气参数 (1)VGS :加在栅源两极之间的最大电压,一般为:-20V-+20V。 VGS额定电压是栅源两极间可以施加的最大电压。设定该额定电压的主要目的是防止电压过高导致的栅氧化层损伤。实际栅氧化层可承受的电压远高于额定电压,但是会随制造工艺的不同而改变…

01-机器学习概述

机器学习的定义 机器学习是一门从数据中研究算法的科学学科。 机器学习直白来讲&#xff0c; 就是根据已有的数据&#xff0c;进行算法选择&#xff0c;并基于算法和数据 构建模型&#xff0c;最终对未来进行预测。 机器学习就是一个模拟人决策过程的一种程序结构。 机器学…

Django——forms组件

Django——forms组件 forms组件&#xff1a;通过后端在Django中定义forms类&#xff0c;可以在 html 中动态的生成一个表单&#xff1b;检验用户提交的数据。 在应用中创建一个名为 &#xff1a;forms 的py文件 # 导入 forms 组件 from django import forms# 自定义 forms …

【python】(09)理解Python中的zip()和zip(*iterable)

系列文章回顾 【python】(01)初识装饰器Decorator 【python】(02)初识迭代器Iterator 【python】(03)初识生成器Generator 【python】(04)python中实现多任务并发和并行的区别 【python】(05)如何使用python中的logging模块记录日志信息 【python】(06)理解Python中的 lambda 、…

借记、贷记、来账、往账、挂账

应用场景&#xff1a;支付系统_跨行支付 一、借、贷、借记、贷记 借、贷&#xff1a;复式记账的一种记账符号&#xff0c;和科目结合起来&#xff0c;可以清晰的表示业务级别的资金流动。 贷记业务&#xff1a;指付款方向收款方发起的付款业务&#xff0c;指负债的增加或资产方…

PWM实现电机的正反转和调速以及TIM定时器

pwm.c #include "pwm.h"/* PWM --- PA2 --TIM2_CH3 //将电机信号控制一根接GND,一根接在PA2(TIM2_CH3)&#xff0c; 输出PWM控制电机快慢 TIM2挂在APB1 定时器频率&#xff1a;84MHZ*/ void Pwm_Init(void) {GPIO_InitTypeDef GPIO_InitStruct;TIM_TimeBaseInitT…

Django下载使用、文件介绍

【一】下载并使用 【1】下载框架 &#xff08;1&#xff09;注意事项 计算机名称不要出现中文python解释器版本不同可能会出现启动报错项目中所有的文件名称不要出现中文多个项目文件尽量不要嵌套,做到一项一夹 &#xff08;2&#xff09;下载 Django属于第三方模块&#…

张宇高数一学习笔记-1-第一讲-函数极限与连续(1)

1、函数的概念与特性 1.1、函数 1、y才是x的函数&#xff0c;而f()是加工法则。 2、定义域是基于加工法则f()存在的&#xff0c;也就是说加工法则f()对()内数据的限制范围就是定义域。而 3、自变量x的取值范围来源于&#xff1a;定义域对()内的含x表达式的限制下得出的x的取值…

【C2架构】

C2架构 C2 架构也就可以理解为&#xff0c;恶意软件通过什么样的方式获取资源和命令&#xff0c;以及通过什么样的方式将数据回传给攻击者 使用的通信方式&#xff1a; 传输协议层 TCP、UDP 网络协议层 icmp&#xff08;ping&#xff09; 应用协议层 HTTP/HTTPS、FTP、DNS、S…

[深度学习] 常见名称概念

SOTA SOTA是指"State-of-the-art"的缩写&#xff0c;意为"最先进的技术"。SOTA是指在某个领域或任务中&#xff0c;当前被认为是最好的技术或模型。随着技术的不断发展和进步&#xff0c;SOTA会随之变化。对于机器学习和人工智能领域而言&#xff0c;SOTA…

20.Ubuntu下安装GCC

文章目录 Ubuntu下安装GCC查看官方安装指导错误缺少gmp库缺少32位开发库libcg: error: gengtype-lex.c: No such file or directoryreference 欢迎访问个人网络日志&#x1f339;&#x1f339;知行空间&#x1f339;&#x1f339; Ubuntu下安装GCC 为了支持新的c标准&#xff…

深入了解 Vue 组件

在 Vue.js 中&#xff0c;组件是构建用户界面的核心概念之一。通过组件&#xff0c;我们可以将界面分割成独立、可复用的模块&#xff0c;使得代码更加清晰、灵活&#xff0c;并且更易于维护。在本文中&#xff0c;我们将深入探讨 Vue 组件的基本概念、创建方法以及常见用法。 …

STM32微控制器中,如何处理多个同时触发的中断请求?

在STM32微控制器中&#xff0c;处理多个同时触发的中断请求需要一个明确的中断优先级策略&#xff0c;以确保关键任务能够及时得到响应。STM32的中断控制器&#xff08;NVIC&#xff09;支持优先级分组&#xff0c;允许开发者为不同的中断设置抢占优先级和子优先级。本文将详细…

uniapp 打包后缺少maps模块和share模块的解决方案

缺失maps模块 我的应用 | 高德控制台 缺失share模块 QQ互联管理中心 微信开放平台

星云小窝项目1.0——项目介绍(一)

星云小窝项目1.0——项目介绍&#xff08;一&#xff09; 文章目录 前言1. 介绍页面2. 首页2.1. 游客模式2.2. 注册用户后 3. 星云笔记3.1. 星云笔记首页3.2. 星云笔记 个人中心3.2. 星云笔记 系统管理3.3. 星云笔记 文章展示3.3. 星云笔记 新建文章 4. 数据中心5. 交流评论6. …

Linux cp、mv命令显示进度条

1.advcpmv 平常使用cp 拷贝大文件时&#xff0c;看不到多久可以完成&#xff0c;虽然加上-v参数也只能看到正在拷贝文件&#xff0c;那就使用以下方法实现 git clone https://github.com/jarun/advcpmv.git cd advcpmv/ bash install.shmv ./advcp /usr/local/bin/ mv ./advmv …

SpringBoot3+Vue3项目的阿里云部署--将后端以及前端项目打包

一、后端&#xff1a;在服务器上制作成镜像 1.准备Dockerfile文件 # 基础镜像 FROM openjdk:17-jdk-alpine # 作者 MAINTAINER lixuan # 工作目录 WORKDIR /usr/local/lixuan # 同步docker内部的时间 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ…

HCIP【PPP协议CHAP验证】

目录 实验目的&#xff1a; 实验拓扑图: 实验过程&#xff1a; 一&#xff1a;按照图示配置所有设备的IP地址 (1)R1和R2使用PPP链路直连 (2)R2和R3把2条PPP链路捆绑为PPP MP直连 二&#xff1a;PPP协议的CHAP验证 &#xff08;3&#xff09;R2 对 R1 的 PPP 进行单向 c…

代码随想录Day57:回文子串、最长回文子序列

回文子串 class Solution { public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int res 0;for(int i s.size() - 1; i > 0; i--){for(int j i; j < s.size(); j){if(i j || (s[i] s[j] …

LeetCode——贪心算法

贪心思想 保证每次操作都是局部最优的&#xff0c;并且最后得到的结果是全局最优的——减少遍历的次数 1.买卖股票的最佳时机 121简单 这里的贪心思想是更新股票的最低价和最大利润&#xff0c;规则是先买后卖 class Solution {public int maxProfit(int[] prices) {// 记录…