關於QT和SQLite以及XML

就關於qt鏈接使用sqlite折騰了一夜.倒也不全是由於數據庫鏈接的問題, 主要仍是數據格式各自出問題.linux

原來的數據庫是access, 爲了導入linux下的sqlite, 我把其輸出格式改爲了xml文檔. 而後在qt中對其進行解析.sql

//    QDomElement docElem = doc.documentElement();
//    //QDomNode n = docElem.firstChild();
//    QDomNodeList list = doc.elementsByTagName(QString("Row")).at(0).toElement().childNodes();

//    QString s = "";
//    for(int i=0; i<list.length();i++){
//        s += list.at(i).toElement().text();
//        if(i!=list.length()-1){
//            s += ",";
//        }
//    }
//    qDebug()<<qPrintable(s);

以上得到的是表的字段, 經過得到的字符串我直接在命令行裏建立了一個表.數據庫

而後就是數據的添加了.函數

首先新建一個connection.h頭文件ui

#ifndef CONNECTION_H
#define CONNECTION_H
#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>

static bool createConnection(){
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("/home/hao/Dangers/Danger.db");

    if(!db.open()){
        qDebug() <<"aaaa";
        QMessageBox::critical(0,"Cannot open database",
                              "unable to establish a database connection.", QMessageBox::Cancel);
        return false;
    }


    return true;
}

#endif // CONNECTION_H

 固然工程要加上   this

 
 
 
 
 QT       += core gui sql xml
而後就是在main.cpp進行操做了
#include<QApplication>
#include<QSqlDatabase>
#include<QDebug>
#include <QString>
#include<QStringList>
#include <QtCore/QCoreApplication>
#include <QtXml>
#include "connection.h"
#include <QVariant>

int main(int argc, char * argv[]){

    QApplication a(argc,argv);

    qDebug() << QDir::currentPath();
    QDomDocument doc;
    QFile file("../database/important.xml");
    if(!file.open(QIODevice::ReadOnly)) {
        qDebug() << "open failed";
        return 0;
    }
    if(!doc.setContent(&file)){
        file.close();
        return 0;
    }

    file.close();


    if(!createConnection()) {
        qDebug() <<"connection failed";
        return 1;
    }


    QSqlQuery query;

    QDomElement docElem = doc.documentElement();
    QDomNodeList list = doc.elementsByTagName(QString("Row"));

    for(int i=1; i<list.length(); i++){
        QString s = "";
        int index = 1;
        QDomNodeList attrs = list.at(i).childNodes();
        for(int j=0; j<attrs.length(); j++){
            if(attrs.at(j).toElement().attribute(QString("ss:Index"))!=""){    //這裏處理費了一陣功夫,由於這個xml文檔中,當有些字段爲空時,它會直接加一個index的標示符,而以前的就不生成節點了.
                while(index < attrs.at(j).toElement().attribute(QString("ss:Index")).toInt()){
                    s = s+"\'" + "\'" + ",";
                    index ++;
                }

            }
            index ++;
            s += '\''+attrs.at(j).toElement().text()+'\'';
            if(index<=96){
                s += ',';
            }
        }
        while(index <= 96){    //一共有96個字段
            s = s+ "\'" + "\'";
            if(index !=96){
                s+=",";
            }
            index++;
        }
        QString sr = "insert into tablename values("+s+")";
        query.exec(sr+";");
        qDebug() << "--------------------------------";
        qDebug() << qPrintable(sr);

    }
    qDebug() << list.length();

    return a.exec();
}

 

/********2016.8.25更新********************/spa

研究了一上午, 寫了一個鏈接數據庫的模板類.命令行

以後固然會有更多的擴充code

/*******connectdb.h***********/
#ifndef CONNECTDB_H
#define CONNECTDB_H

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QString>
#include <QMessageBox>
#include <QComboBox>

class ConnectDB
{
public:
    ConnectDB(QString dbname="database.db
");
    //ConnectDB();
    ~ConnectDB();

    QSqlDatabase db;
    QSqlQuery select(QString sql);

    void getSubstance(QComboBox *box);
};

#endif // CONNECTDB_H



/****************connectdb.cpp*************/
#include "connectdb.h"
#include <QDebug>

ConnectDB::ConnectDB(QString dbname)
{
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(dbname);
    if( !db.open() ){
        QMessageBox::critical(0, "Cannot open database",
                              "Unable to establish a database connection.", QMessageBox::Cancel);
    }
}

ConnectDB::~ConnectDB(){

}

QSqlQuery ConnectDB::select(QString sql){
    QSqlQuery query;
    query.exec(sql);
    return query;
}

//這個函數做用是獲取數據庫中的物質名稱填充到組件的comboBox中去
void ConnectDB::getSubstance(QComboBox *box){
   QString sql = "select 中文名稱 from tablename order by id";
   QSqlQuery query = this->select(sql);
   while(query.next()){
       QString item = query.value(0).toString();
       box->addItem(QString(item));
   }
}



/**********調用方法************/


#include "connectdb.h"

......

ConnectDB *db = new ConnectDB();

    ComboBox *nameSelect = new QComboBox;
    db->getSubstance(nameSelect);
    
相關文章
相關標籤/搜索