Qt 提供了很多操作数据库的类,
SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于 250KiB。 SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。就像其他数据库, SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。 SQLite 可以直接访问其存储文件。
QSqlDatabase 类用于建立数据库的连接,往往以指定加载的数据库驱动,然后设置数据库的登录参数,如主机地址,用户名、登录密码等。这些都是服务器类型的数据库所需要做的操作
在 QSqlDatabase 连接数据库后,用 QSqlTableModel 从数据库里读取出表格模型,然后通过 Qt 的 QTableView 类显示数据库的内容在我们面前。
/*需要添加模块*/
QT += sql
/* 查看本机可用的数据库驱动 */
QStringList drivers = QSqlDatabase::drivers();
foreach(QString driver, drivers) {
qDebug()<<driver;
}
/* 以QSQLITE驱动方式打开或者创建数据库 */
sqlDatabase = QSqlDatabase::addDatabase("QSQLITE");
sqlDatabase.setDatabaseName("alarm.db");
/* 以open的方式打开alarm.db数据库,则会创建一个alarm.db */
if (!sqlDatabase.open())
qDebug()<<"连接数据库错误"<<sqlDatabase.lastError()<<endl;
else
qDebug()<<"连接数据库成功"<<endl;
QSqlQuery query(sqlDatabase);
/* 使用指令式创建表 */
query.exec("create table alarm (id int primary key, time vchar(15), flag vchar(5))"); // primary 说明id不能为空
/* 以指令的方式插入数据 */
//query.exec("insert into alarm values(0, '06:00', 'false')");
model = new QSqlTableModel(this, sqlDatabase);
/* 模型设置表的名字,需要与数据库的表的名字相同 */
model->setTable("alarm");
/* 如果有修改则同步修改到数据库,
* 注意这个规则需要与tabview这样的控件才生效,
* 因为tabview可以直接编辑表里的内容 */
model->setEditStrategy(QSqlTableModel::OnFieldChange);
/* 成功则返回true,查看数据库里是否有alarm这个表格 */
model->select();
/* 如果数据表数据为空,则添加两个闹钟 */
if (model->rowCount() == 0) {
/* 插入一行 */
model->insertRow(model->rowCount());
/* 在该行插入数据 */
model->setData(model->index(0, 0), 1);
model->setData(model->index(0, 1), "06:00");
model->setData(model->index(0, 2), "false");
/* 插入数据后记得提交 */
model->submit();
/* 再插入一行 */
model->insertRow(model->rowCount());
model->setData(model->index(1, 0), 2);
model->setData(model->index(1, 1), "18:00");
model->setData(model->index(1, 2), "true");
/* 提交 */
model->submit();
}
/* 打印出闹钟数据库里的信息 */
for (int i = 0; i < model->rowCount(); i++) {
for (int j = 0; j < 3; j++) {
QModelIndex qindex = model->index(i, j);
switch (j) {
case 0:
qDebug()<<"第"<< model->data(qindex).toInt()<<"行数据";
break;
case 1:
listWidget->addItem(model->data(qindex).toString());
qDebug()<<"闹钟时间为:"<< model->data(qindex).toString();
break;
case 2:
qDebug()<<"闹钟状态为:" << model->data(qindex).toString()<<endl;
if (model->data(qindex).toString() != "true")
listWidget->item(i)->setTextColor(QColor(22, 22, 22, 60));
else
listWidget->item(i)->setTextColor(QColor(22, 22, 22, 225));
break;
default:
break;
}
}
}
/* 获取数据库里的闹钟开关状态 */
QModelIndex qindex = model->index(i, 2);
bool sw = model->data(qindex).toBool()
/*设置数据库里的闹钟开关状态 */
QModelIndex qindex = model->index(i, 2);
model->setData(qindex, "true");
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),
QJsonValue
void remove(const QString &key);
QJsonValue take(const QString &key);
bool contains(const QString &key) const;
void remove(QStringView key);
void remove(QLatin1String key);
QJsonValue take(QStringView key);
QJsonValue take(QLatin1String key);
bool contains(QStringView key) const;
bool contains(QLatin1String key) const;
QJsonArray
删除数组 i;
void removeAt(int i); //jArray.removeAt(0); //ok //删除第0项
QJsonValue takeAt(int i); //qDebug() << jArray.takeAt(0).toInt() << endl; //删除第0项并返回值
替换:
QJsonArray jArray= configJson->RootObj().value("IP").toArray();
jArray.insert(3,jArray); //ok
jArray.replace(3,jArray); //ok
jArray[4]= 12; //无效 数组越界无效
jArray[0]= 54; //ok
(*configJson->RootObjPointer())["IP"]=jArray; //获取指针方式修改“IP”
configJson->savejsonfile();
QJsonObject
是否包含
是否包含Student
QJsonObject obj=doc.object();
if(obj.contains("Student"))
{
}
/*创建对象并转换成QByteArray*/
QJsonObject rootobj;
rootobj["sn"] = 20001;
rootobj["type"] = "hub";
QJsonDocument jsonDoc(rootobj);
QByteArray byte=jsonDoc.toJson(); //按照json风格生成字符串,自动缩进,有空格和\n \t ; 数据量大
QByteArray byte=jsonDoc.toJson(QJsonDocument::Compact);//传入参数获取压缩后的序列化结果,紧凑格式,直接生成一堆字符串,但是占用控件小
/*QByteArray转换成QJsonDocument,并得到数据*/
QJsonDocument jsonDoc1 = QJsonDocument::fromJson(byte); //QByteArray转换成文档对象
QJsonObject obj1 = jsonDoc1.object();
qDebug() << "obj1=" << obj1["sn"].toInt() << obj1["type"].toString() << endl;
插入
jsonObject.insert("name", QString::number(i+1));
jsonObject.insert("age", i+18);
jsonObject.insert("time", QDateTime::currentDateTime().toString());
json说明
/*【】是用来填充数据使用 */
(*configJson->RootObjPointer())["IP"]=jArray;
/*.value 这种方式是用来获取数据*/
(*configJson->RootObjPointer()).value("IP")=jArray;
json注意事项:
数组中不能是00 "NightMode": [18, 00, 0, 6, 0, 0] //解析不出来
数组中是int类型的数据 不要用QString 去替换,会不成功。
修改json类型要修改他的指针,重新填充数据要重新赋值给上层的父类,保存才能达到效果,不能获取的只是临时变量。(如下例子)
QJsonArray jArray= configJson->RootObj().value("IP").toArray();
jArray[4]= 12; //无效 (数组越界 )
jArray.insert(3,jArray); //ok (可以插入任意类型 )
jArray.replace(3,jArray); //ok (可以替换任意类型 )
jArray[0]= 54; //ok (数组不越界 )
(*configJson->RootObjPointer())["IP"]=jArray; //Ok (通过指针来获取“IP”,并赋值)
configJson->savejsonfile();
案例1:
QString fileName = QCoreApplication::applicationDirPath();
fileName+="/pdoctor.json";
doctorjson = new Json(fileName);
QJsonArray doctor = doctorjson->Obj()["data"].toArray();
int row = doctor.count();
for (int i=0;i<row;i++)
{
}
doctor.at(i).toObject()["advice"].toObject()["adviceSeq"].toInt();
doctor.at(i).toObject()["advice"].toObject()["drugName"].toString();
doctor.at(i).toObject()["advice"].toObject()["adviceType"].toInt();
doctor.at(i).toObject()["advice"].toObject()["freq"].toString();
doctor.at(i).toObject()["advice"].toObject()["drugvolume"].toDouble();
doctor.at(i).toObject()["advice"].toObject()["drugDensity"].toDouble();
案例2:
案例3:
/*****************************************************************************************/
QByteArray byte;
QFile file(file_path);
if(file.exists()){
file.open(QIODevice::ReadOnly|QIODevice::Text);
byte=file.readAll();
file.close();
}
else
{
cout<<"openFileError"<<endl;;
}
QJsonParseError json_error;
QJsonDocument jsonDoc(QJsondocument::fromJson(byte,&json_error));
if(json_error.err!=QJsonParseError::NoError)
{
cout<<" json error "<<endl;
}
QJsonObject rootobj=jsonDoc.object();
//一般需要使用 rootobj.contains(xxx) 判断一下是否存在 这里我们就默认是存在的 。
QJsonObject A_obj=rootobj.value("A").toObject();
A_obj["AA"]=33;
QJsonArray B_array=rootobj.value("B").toArray();
QJsonObject B_Subobj=B_array[0].toObject();
QJsonArray b_array=B_Subobj.value("BB").toArray();
b_array.replace(0,"BBB");
B_Subobj["BB"]=b_array;
B_array.replace(0,B_Subobj);
QJsonObject C_obj=rootobj.value("C").toObject();
QJsonArray c_array=C_obj.value("CC").toArray();
c_array.replace(0,"CCC");
C_obj["CC"]=c_array;
rootobj["A"]=A_obj;
rootobj["B"]=B_array;
rootobj["C"]=C_obj;
QFile file(file_path);
if(file.exists()){
file.open(QIODevice::WriteOnly|QIODevice::Text);
jsonDoc.setObject(rootobj);
file.seek(0);
file.write(jsonDoc.toJson());
file.flush();
file.close();
}
dock案例:
#include "json.h"
Json::Json(QString fileName)
{
jsonName=fileName;
openjsonfile(jsonName);
}
Json::~Json()
{
savejsonfile();
}
void Json::openjsonfile(QString name)
{
if(QFile::exists(name))
{
QByteArray byte;
QJsonDocument jsonDoc;
QFile file;
file.setFileName(name);
file.open(QFile::ReadOnly|QIODevice::Text);
byte= file.readAll();
jsonDoc = QJsonDocument::fromJson(byte);//转换成文档对象
if(jsonDoc.isObject()){ //判断文档对象中存储的数据是不是json对象
isfile = true;
rootobj = jsonDoc.object();//得到rootJson对象
file.close();
}
}else{
isfile = false;
}
}
void Json::savejsonfile()
{
QFile file;
QJsonDocument jsonDoc(rootobj); //将Json对象,转换成Json文档
// jsonDoc.setObject(rootobj);
file.setFileName(jsonName);
file.open(QFile::WriteOnly|QIODevice::Text);
file.seek(0);
file.write(jsonDoc.toJson());
file.flush();
file.close();
}
int Json::getKeyIntVal(QString key)
{
return rootobj[key].toInt();
}
QString Json::getKeyStringVal(QString key)
{
return rootobj[key].toString();
}
bool Json::getKeyBoolVal(QString key)
{
return rootobj[key].toBool();
}
//读取空值(因其没有对应的to类型函数,可使用下方类型接收或isNull()函数判断)
QVariant Json::getKeyVarialVal(QString key)
{
return rootobj[key].toVariant();
}
QJsonObject Json::getKeyQJsonObject(QString key)
{
return rootobj[key].toObject();
}
QJsonArray Json::getKeyQJsonArray(QString key)
{
return rootobj[key].toArray();
}
int Json::getArrayIndexIntVal(QString key, int index)
{
return rootobj[key].toArray().at(index).toInt();
}
QJsonObject Json::RootObj()
{
return rootobj;
}
QJsonObject* Json::RootObjPointer()
{
return &rootobj;
}
bool Json::getisfile()
{
return isfile;
}
void Json::insertKeyIntVal(QString key, int valu)
{
rootobj[key]=valu;
}
/*
*
*netjson->insertKeyBoolVal("NightMode",true); ok
*/
void Json::insertKeyBoolVal(QString key, bool valu)
{
rootobj[key]=valu;
}
/*
*netjson->insertKeyStringVal("NightMode","opopopo"); Ok
*/
void Json::insertKeyStringVal(QString key, QString valu)
{
rootobj[key]=valu;
}
/*
* QJsonArray c_JsArr;
* c_JsArr.append(12);
* c_JsArr.append(32);
* netjson->insertKeyArrayVal("NightMode",c_JsArr); //Ok
*/
void Json::insertKeyArrayVal(QString key, QJsonArray array)
{
rootobj[key]= array;
}
/*
* QJsonObject jsobject;
jsobject["opo"] = "qqqqqq";
jsobject["op1"] = 12;
jsobject["op2"] = true;
jsobject["op3"] = "rrrrrr";
netjson->insertKeyObjectVal("NightMode",jsobject);
*
*/
void Json::insertKeyObjectVal(QString key, QJsonObject jsobject)
{
rootobj[key]=jsobject;
}
/*
* netjson->replaceKeyArrayIndexVal("NightMode",5,10); //ok
**/
void Json::replaceKeyArrayIndexVal(QString key, int index, int valu) //valu 为 QString 不能替换
{
QJsonArray c_JsArr = rootobj.value(key).toArray();
c_JsArr.replace(index,valu);
rootobj[key]=c_JsArr;
}
/* 数组里面添加QJsonArray
* QJsonArray c_JsArr;
* c_JsArr.append(12);
* c_JsArr.append(32);
* c_JsArr.replace(0,24); //替换
* netjson->insertArrayKeyAddArrayVal("NightMode",0,c_JsArr);
*/
void Json::insertArrayKeyAddArrayVal(QString key, int index, QJsonArray valu)
{
QJsonArray c_JsArr = rootobj.value(key).toArray();
c_JsArr[index] = valu;
rootobj[key]=c_JsArr;
}
/*
* 数组里面添加QJsonObject
* QJsonObject jsobject;
* jsobject["opo"] = "qqqqqq";
* jsobject["op1"] = 12;
* jsobject["op2"] = true;
* jsobject["op3"] = "rrrrrr";
* netjson->insertArrayKeyAddObjectVal("NightMode",0,jsobject);
*/
void Json::insertArrayKeyAddObjectVal(QString key, int index, QJsonObject jsobject)
{
QJsonArray c_JsArr = rootobj.value(key).toArray();
c_JsArr[index] = jsobject;
rootobj[key]=c_JsArr;
}
#ifndef JSON_H
#define JSON_H
#include
#include
#include
#include
#include
#include
#include
#include
#include
class Json
{
public:
Json(QString file);
~Json();
void openjsonfile(QString name);
void savejsonfile();
int getKeyIntVal(QString key);
QString getKeyStringVal(QString key);
bool getKeyBoolVal(QString key);
QVariant getKeyVarialVal(QString key);
QJsonArray getKeyQJsonArray(QString key);
QJsonObject getKeyQJsonObject(QString key);
int getArrayIndexIntVal(QString key, int index);
QJsonObject RootObj();
QJsonObject* RootObjPointer();
bool getisfile();
//将键值对添加到Json对象中
void insertKeyIntVal(QString key,int valu);
void insertKeyBoolVal(QString key,bool valu);
void insertKeyStringVal(QString key,QString valu);
void insertKeyArrayVal(QString key,QJsonArray array);
void insertKeyObjectVal(QString key, QJsonObject jsobject);
void replaceKeyArrayIndexVal(QString key, int index, int valu);
void insertArrayKeyAddArrayVal(QString key, int index, QJsonArray valu);
void insertArrayKeyAddObjectVal(QString key, int index, QJsonObject jsobject);
private:
QString jsonName;
QJsonObject rootobj;
bool isfile ;
};
#endif // JSON_H