数据中心类DataCenter(三)
前言
在上一集,我们就完成了整个数据中心类的构造函数以及析构函数,我们讨论了我们的数据持久化的相关事宜,那么我们这一集就要来完成这一个内容。
需求分析
我们需要暂且就规定我们的路径为系统目录的路径(Qt内置函数)+ ChatClient.json这个文件。
我们就需要写三个函数,一个是用于初始化数据文件的方法,一个用于写入文件数据的方法,一个用于读文件数据的方法。
initDataFile
我们要使用QStandardPaths这个Qt内置的类获取到我们当前电脑的系统目录的AppData文件下的Roaming/ChatClient路径
void DataCenter::initDataFile()
{//构造文件的路径,使用系统目录AppData"QString basePath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);QString filePath = basePath + "/ChatClient.json";//LOG() << "filePath=" << filePath;//判断是否存在QDir dir;if(!dir.exists(basePath)){dir.mkpath(basePath);}//构造好了文件路径就创建出来//写方式QFile file(filePath);if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){LOG() << "打开文件失败!" << file.errorString();return;}//打开成功,写入初始内容QString data = "{\n}";file.write(data.toUtf8());file.close();
}
我们要先检查一下文件/目录是否存在,不存在就要我们创建这个文件/目录。这里我们也是使用了Qt内置的QDir类
saveDataFile
这里就要开始正式使用我们的JSON了
void DataCenter::saveDataFile()
{QString filePath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/ChatClient.json";QFile file(filePath);if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){LOG() << "打开文件失败!" << file.errorString();return;}//按照json格式写入数据QJsonObject jsonObj;jsonObj["loginSessionId"] = loginSessionId;QJsonObject jsonUnread;for(auto it = unreadMessageCount->begin(); it != unreadMessageCount->end(); ++it){jsonUnread[it.key()] = it.value();}jsonObj["unread"] = jsonUnread;//写入文件QJsonDocument jsonDoc(jsonObj);QString s = jsonDoc.toJson();file.write(s.toUtf8());//关闭文件file.close();
}
我们要嵌套JSON来保存未读信息的内容。写入文件的时候就要使用QJsonDocument。
loadDataFile
这个是比较关键的一个内容,我们在整个DataCenter被实例化的时候就要被调用执行,所以我们就要在DataCenter的构造函数里面添加一行这个方法。
void DataCenter::loadDataFile()
{//确保加载之前,针对文件进行初始化QString filePath = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation) + "/ChatClient.json";//判定文件是否存在,初始化QFileInfo fileInfo(filePath);if(!fileInfo.exists()){initDataFile();}//读方式打开文件QFile file(filePath);if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){LOG() << "打开文件失败!" << file.errorString();return;}//读取文件内容,解析成json对象QJsonDocument jsonDoc = QJsonDocument::fromJson(file.readAll());if(jsonDoc.isNull()){LOG() << "解析JSON文件失败!JSON文件格式错误!";file.close();return;}QJsonObject jsonObj = jsonDoc.object();this->loginSessionId = jsonObj["loginSessionId"].toString();LOG() << "loginSessionId=" << loginSessionId;//先清空unreadMessageCountthis->unreadMessageCount->clear();QJsonObject jsonUnread = jsonObj["unread"].toObject();for(auto it = jsonUnread.begin(); it != jsonUnread.end(); ++it){this->unreadMessageCount->insert(it.key(),it.value().toInt());}file.close();
}
最后要清空unreadMessageCount再读取文件里的内容,记得insert的时候,要把后面的value给转成int,我们存放的是未读信息的条数。
运行代码
main.c里面添加以下代码即可
//debugmodel::DataCenter* dataCenter = model::DataCenter::getInstance();dataCenter->initDataFile();dataCenter->saveDataFile();
我们运行后就可以发现
点击进去~
就可以看到我们的内容了,也就说明我们的数据持久化成功了。
那么这一集就先到这里。