【Qt-数据库】

Qt编程指南

  • ■ SQLite
  • ■ CSV
  • ■ JSON

■ SQLite

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");

■ CSV

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),

■ JSON

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

你可能感兴趣的:(#,Qt,数据库,qt)