网盘——数据库操作

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

数据库是在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本地,远程就写远程的ip
    m_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.mfbz.cn/a/485786.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2016年认证杯SPSSPRO杯数学建模D题(第二阶段)NBA是否有必要设立四分线全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 D题 NBA是否有必要设立四分线 原题再现&#xff1a; NBA 联盟从 1946 年成立到今天&#xff0c;一路上经历过无数次规则上的变迁。有顺应民意、皆大欢喜的&#xff0c;比如 1973 年在技术统计中增加了抢断和盖帽数据&#xff1b;有应运而生、力…

linux 通过nvm安装node.js

我的博客原文&#xff1a;linux 通过nvm安装node 前言 nvm是一个node版本控制的工具&#xff0c;他可以查看可以安装的node版本&#xff0c;安装node&#xff0c;以及切换node版本&#xff0c;传统的node安装&#xff0c;我们是下载压缩包&#xff0c;然后指定环境变量&…

蓝桥杯算法赛(二进制王国)

问题描述 二进制王国是一个非常特殊的国家&#xff0c;因为该国家的居民仅由 0 和 1 组成。 在这个国家中&#xff0c;每个家庭都可以用一个由 0 和 1 组成的字符串 S 来表示&#xff0c;例如 101、 000、 111 等。 现在&#xff0c;国王选了出 N 户家庭参加邻国的庆典…

吴恩达深度学习笔记:神经网络的编程基础2.15-2.17

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第二周&#xff1a;神经网络的编程基础 (Basics of Neural Network programming)2.15 Python 中的广播&#xff08;Broadcasting in Python&#xff09;2.16 关于 python _ numpy 向量的说明&…

SpringCloud - 架构体系详解

Spring Cloud简介 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。 Spring并没有重复制造…

我在京东做数据分析,一位京东数据分析师的工作日常

有人说&#xff1a;“种下一棵树最好的时间是十年前&#xff0c;其次是现在”。任何时候&#xff0c;我们都应该抓住机遇&#xff0c;说不定就是改变你现状的一个机会。 2020年&#xff0c;我在疫情得到控制后&#xff0c;面试入职京东大数据组&#xff0c;截止目前&#xff0…

【项目设计】基于MVC的负载均衡式的在线OJ

项目代码&#xff08;可直接下载运行&#xff09; 一、项目的相关背景 学习编程的小伙伴&#xff0c;大家对力扣、牛客或其他在线编程的网站一定都不陌生&#xff0c;这些编程网站除了提供了在线编程&#xff0c;还有其他的一些功能。我们这个项目只是做出能够在线编程的功能。…

浏览器工作原理与实践--渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的

在上一篇文章中我们介绍了导航相关的流程&#xff0c;那导航被提交后又会怎么样呢&#xff1f;就进入了渲染阶段。这个阶段很重要&#xff0c;了解其相关流程能让你“看透”页面是如何工作的&#xff0c;有了这些知识&#xff0c;你可以解决一系列相关的问题&#xff0c;比如能…

机器人自动驾驶时间同步进阶

0. 简介 之前时间同步也写过一篇文章介绍机器人&自动驾驶中的时间同步。在最近的学习中发现一些额外需要阐述学习的内容&#xff0c;这里就再次写一些之前没写到的内容。 1. NTP NTP 是网络时间协议&#xff0c;用来同步网络中各计算机时间的协议&#xff0c;把计算机的…

京东商品详情API接口:一键获取商品信息的智能助手

京东商品详情API接口&#xff1a;一键获取商品信息的智能助手 请求示例&#xff0c;API接口接入Anzexi58 在数字化浪潮席卷而来的今天&#xff0c;数据已经渗透到各行各业&#xff0c;成为驱动商业发展的重要引擎。对于电商行业而言&#xff0c;快速、准确地获取商品信息对于…

【Hadoop大数据技术】——Hadoop高可用集群(学习笔记)

&#x1f4d6; 前言&#xff1a;Hadoop设计之初&#xff0c;在架构设计和应用性能方面存在很多不如人意的地方&#xff0c;如HDFS和YARN集群的主节点只能有一个&#xff0c;如果主节点宕机无法使用&#xff0c;那么将导致HDFS或YARN集群无法使用&#xff0c;针对上述问题&#…

无人驾驶中的坐标转换

无人驾驶中的坐标转换 无人车上拥有各种各样的传感器&#xff0c;每个传感器的安装位置和角度又不尽相同。对于传感器的提供商&#xff0c;开始并不知道传感器会以什么角度&#xff0c;安装在什么位置&#xff0c;因此只能根据传感器自身建立坐标系。无人驾驶系统是一个多传感器…

知识图谱-图数据库-neo4j (1)踩坑记录

1、neo4j 安装 由于目前还是用的 jdk8;所以需要安装jdk8支持的neo4j 乌班图系统 # 安装指定社区版本 sudo apt-get install neo4j #不指定&#xff0c;安装最新版本 sudo apt-get install neo4j1:3.5.35 # 指定版本 jdk1.8的原因# 企业版本 sudo apt-get install neo4j-ent…

贝尔曼最优方程【BOE】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 文章目录 强化学习笔记一、最优策略二、贝尔曼最优方程(BOE)三…

【C++ 函数参数】指针类型和指针引用类型的区别

目录 0 引言1 参数是指针类型2 参数是指针的引用3 总结 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;C专栏&#x1f4a5; 标题&#xff1a;【C 函数参数】指针类型和指针引用类型的区别❣️ 寄语&#xff1a;人生的意义或许可以发挥自己全部的潜…

对外开放接口的Appkey和Secret应该如何设置?

文章目录 appkey和Secret 分别是什么&#xff1f;App keyapp secret Appkey和Secret 因遵循什么原则&#xff1f;代码示例随机生成有效的appkey校验Appkey调用效果 小结 appkey和Secret 分别是什么&#xff1f; App key App key简称API接口验证序号&#xff0c;是用于验证API…

C++ - 类和对象(上)

目录 一、类的定义 二、访问限定符 public&#xff08;公有&#xff09; protected&#xff08;保护&#xff09; private&#xff08;私有&#xff09; 三、类声明和定义分离 四、外部变量和成员变量的区别与注意 五、类的实例化 六、类对象的模型 七、类的this指针…

linux系统编程 socket part2

报式套接字 1.动态报式套接字2.报式套接字的广播3.报式套接字的多播4.UDP协议分析4.1.丢包原因4.2.停等式流量控制 接linux系统编程 socket part1 1.动态报式套接字 在之前的例子上&#xff0c;发送的结构体中的名字由定长改变长。可以用变长结构体。 变长结构体是由gcc扩展的…

主流电商平台淘宝/1688/京东电商数据实时采集监测|电商API接口接入

电商大数据平台基于网络主流电商平台淘宝/1688/京东电商数据进行搭建&#xff0c;全面监测了包含淘宝、京东、苏宁、美团、大众点评等共计100余个主流电商交易平台&#xff0c;并凭借多年的电子商务数据分析挖掘经验积累形成的电商数据清洗体系和挖掘模型&#xff0c;能高效完成…

ARIMA

一.数据平稳性与差分法 1.平稳性&#xff1a; 2.差分法&#xff1a; 错开时间点&#xff0c;使得数据可以平稳 原数据➡️一阶差分➡️二阶差分&#xff1a; 二、arima 1.自回归模型 2.移动平均模型 关注的是误差项的累积 3.arma p d(几阶差分&#xff09; q自己指定 4.总…
最新文章