就關於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);