关于网盘的数据库模块,主要有以下几个内容:定义数据库操作类、将数据库操作类定义成单例模式、数据库操作
数据库是在Qt里面,定义成操作类,专门用这个类产生对象,对数据库实现操作,那么我们在产生对象的时候是把他定义为单例模式这样使用起来会比较方便,在这个函数中我们会对数据库进行各种操作,会把相应的函数操作封装到这个类里面,作为成员函数。
目录
1.1、输入dir查看目录,所有的注册信息都是保存在服务器端(TcpServer)
1.4、再添加一个判断是否登陆过,//默认是不在线的,加入在线登陆成功就将这个值置为1,如果在登陆的时候检测到这个值是1的话,就禁止重复登陆。
1.5、创建好友表,id可以对应多个好友,所以主键不可以用id,不能用单个id作为主键。在这里我们把id和friendId同时合成主键
2.1、在TcpServer里面添加一个新文件,专门用来操作数据库,如果要支持信号槽的话,必须基类选择QObject
A、连接数据库,要引用头文件,在operatedb.h里面添加头文件
E、在构造函数里面告诉QsqlDatabase我们要操作的数据库是一个什么数据库(sqlite)
[b、需要操作的数据库的名字 ,这个要添加到资源文件](#b、需要操作的数据库的名字 ,这个要添加到资源文件)
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、运行测试
成功