关于QT和SQLite以及XML
就关于qt连接使用sqlite折腾了一晚上.倒也不全是因为数据库连接的问题, 主要还是数据格式各自出问题.
原来的数据库是access, 为了导入linux下的sqlite, 我把其输出格式改成了xml文档. 然后在qt中对其进行解析.
// 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头文件
#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
当然工程要加上
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 ;
}
if(!doc.setContent(&file)){
file.close();
return ;
} file.close(); if(!createConnection()) {
qDebug() <<"connection failed";
return ;
} QSqlQuery query; QDomElement docElem = doc.documentElement();
QDomNodeList list = doc.elementsByTagName(QString("Row")); for(int i=; i<list.length(); i++){
QString s = "";
int index = ;
QDomNodeList attrs = list.at(i).childNodes();
for(int j=; 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<=){
s += ',';
}
}
while(index <= ){ //一共有96个字段
s = s+ "\'" + "\'";
if(index !=){
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更新********************/
研究了一上午, 写了一个连接数据库的模板类.
之后当然会有更多的扩充
/*******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(, "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().toString();
box->addItem(QString(item));
}
} /**********调用方法************/ #include "connectdb.h" ...... ConnectDB *db = new ConnectDB(); ComboBox *nameSelect = new QComboBox;
db->getSubstance(nameSelect);
关于QT和SQLite以及XML的更多相关文章
- 在qt中用tcp传输xml消息
在qt中用tcp传输xml消息 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:Qt5 3.1.2 说明: 在tcp上 ...
- Qt 操作SQLite数据库
项目中通常需要采用各种数据库(如 Qracle.SQL Server.MySQL等)来实现对数据的存储.查询等功能.下面讲解如何在 Qt 中操作 SQlite 数据库. 一.SQLite 介绍 Sql ...
- Qt Write and Read XML File 读写XML文件
在Qt中,我们有时候需要把一些参数写入xml文件,方便以后可以读入,类似一种存档读档的操作,例如,我们想生成如下的xml文件: <?xml version="1.0" enc ...
- Qt读取JSON和XML数据
QJSON JSON(JavaScript Object Notation)是一个轻量级的数据交换格式; 可以将数据以name/value的形式任意组合; QJson 是一个基于Qt的库, 将JSON ...
- Qt之QDomDocument操作xml文件-模拟ini文件存储
一.背景 不得不说Qt是一个很强大的类库,不管是做项目还是做产品,Qt自身封装的东西就已经非常全面了,我们今天的这篇文章就是模拟了Qt读写ini文件的一个操作,当然是由于一些外力原因,我们决定自己来完 ...
- QT使用SQLite
在QT的widget中用tableview显示sqlite数据库表中的内容. 用QTcreator创建一个基于Widget类的窗口,再拖一个tableview到widget中,保存. 1.在widge ...
- qt中用tcp传输xml消息 good
本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN7 开发环境:Qt5 3.1.2 说明: 在tcp上传输xml消息. 协议格式如 ...
- Qt基于sqlite数据库的管理小软件
闲来无事,写了一个基于sqlite的数据库管理小软件. 先上图 中心思想就是: 创建一个数据库 然后每一个分组对应一个数据表 然后遍历该数据表.将名字以treewidgetItem显示出来.添加删除实 ...
- QT中Sqlite的使用
环境: 静态编译过sqlite 步骤: 1.C++链接器中加入Sqlite.lib,然后在测试一下是否能正常加载Sqlite驱动 #include<QtPlugin> Q_IMPORT_P ...
随机推荐
- Ubuntu下Tomcat绑定80端口(zz)
Ubuntu下Tomcat绑定80端口 来源:本站转载 作者:佚名 时间:2011-02-22 TAG: 工作环境迁移到了Ubuntu,很多东西发生了变化,比如原先配置tomcat端口.只需要配置se ...
- OpenSSH配置与基本使用
SSH访问远程 SSH常见分类: telnet-远程登录协议,23/TCP 明文认证.明文传输(不安全) ssh(Secure SHell)-应用层协议,22/TCP 通讯和认证过程加密.主机认证 用 ...
- Hexo之部署github
最近开始学NodeJs,准备也在github上弄个一个Hexo博客练练过程中遇到一些问题总结一下.希望对遇到同样问题的同学能有个帮助少走一些弯路. - 其实用windows或mac客户端直接去同步很顺 ...
- 计算器的改良(NOIP2000)
题目链接:计算器的改良 这道题,不是很难,但代码也短不到哪去. 我们这里决定采取边读入边计算的方法,因为题目没有明确说式子有多长. 我们需要计算什么? 我们需要知道等号两边未知数的系数和常数项即可. ...
- Java基本语法实验报告
题目: Java基本语法 课程名称: JAVA语言程序设计 班 级: 信1705-1 姓 名: 刘雨馨 学号: 20173445 指导教师: ...
- struct sk_buff和struct net_device
1.struct sk_buff 1.1概念 sk_buff是是linux内核中描述数据包的结构体,可在各个协议层之间传递,如数据链路层.网络层.运输层 1.2成员组成 1)布局 sk_buff是一个 ...
- maven打包到私服,打的是war包,好郁闷
jenkins打完包上传到私服以后,发现只有war包,然而并木有别人想要的jar包,郁闷之极啊! 然后把公司的项目做了对比,发现这个正常的能上传jar包的项目的与我的另一个项目有点出入: 正常: 异 ...
- 查阅Springboot官方文档方式----------------Springboot2.0.2最新稳定版
1.登录官方网址: https://spring.io/ 如图所示: 2.选择PROJECTS,就可以看到spring所有的相关项目了. 点开后:其中就包括了Spingboot 3.版本选择,红圈部分 ...
- UVaLive 3704 Cellular Automaton (循环矩阵 + 矩阵快速幂)
题意:一个细胞自动机包含 n 个格子,每个格子取值是 0 ~ m-1,给定距离,则每次操作后每个格子的值将变成到它距离不超过 d 的所有格子在操作之前的值之和取模 m 后的值,其中 i 和 j 的距离 ...
- Ubuntu下安装并配置TexStudio
作者:tongqingliu 转载请注明出处:http://www.cnblogs.com/liutongqing/p/7069715.html Ubuntu下安装并配置TexStudio Ubunt ...