网盘——数据库操作

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

数据库是在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、需要操作的数据库的名字 ,这个要添加到资源文件](#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、在数据库下面创建信息表:用户信息表,好友表

sql 复制代码
create table usrInfo(id integer primary key autoincrement,  name varchar(32) unique,pwd varchar(32));

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

sql 复制代码
alter table usrInfo add online integer default 0

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

sql 复制代码
create table friend(id integer, friendId integer, primary key(id, friendId));

1.6、查看创建表格

sql 复制代码
.tables

1.7、退出来

sql 复制代码
.quit

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

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

2、定义数据库操作类

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

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

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

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

3.1、定义单例

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

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

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

sql 复制代码
static OperateDB& getInstance();

B、通过类名直接来调用

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

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

3.2、连接数据库

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

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

sql 复制代码
#include <QtSql/QSqlDatabase>

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

sql 复制代码
#include <QtSql/QSqlQuery>

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

sql 复制代码
private:
    QSqlDatabase m_db;

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

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

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

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

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

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

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

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

G、打开数据库

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

sql 复制代码
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、引入头文件
sql 复制代码
#include "operatedb.h"
sql 复制代码
OperateDB::getInstance().init();

main.cpp的完整代码

sql 复制代码
#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、创建析构函数

sql 复制代码
~OperateDB();

B、关掉数据库

sql 复制代码
OperateDB::~OperateDB()
{
    //关掉数据库
    m_db.close();
}

3.3、运行测试

成功

相关推荐
阿华的代码王国18 分钟前
MySQL ------- 索引(B树B+树)
数据库·mysql
Hello.Reader1 小时前
StarRocks实时分析数据库的基础与应用
大数据·数据库
执键行天涯1 小时前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
yanglamei19621 小时前
基于GIKT深度知识追踪模型的习题推荐系统源代码+数据库+使用说明,后端采用flask,前端采用vue
前端·数据库·flask
工作中的程序员1 小时前
ES 索引或索引模板
大数据·数据库·elasticsearch
严格格1 小时前
三范式,面试重点
数据库·面试·职场和发展
微刻时光2 小时前
Redis集群知识及实战
数据库·redis·笔记·学习·程序人生·缓存
单字叶2 小时前
MySQL数据库
数据库·mysql
mqiqe2 小时前
PostgreSQL 基础操作
数据库·postgresql·oracle
just-julie2 小时前
MySQL面试题——第一篇
数据库·mysql