QT与SQLite数据库学习资料

合集下载

SQLite的介绍操作Sqlite具体实例

SQLite的介绍操作Sqlite具体实例

SQLite的介绍操作Sqlite具体实例1.SQLite简介SQLite是⼀款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计⽬标是嵌⼊式的,⽽且⽬前已经在很多嵌⼊式产品中使⽤了它,它占⽤资源⾮常的低,在嵌⼊式设备中,可能只需要⼏百K的内存就够了。

它能够⽀持 Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语⾔相结合,⽐如Tcl、PHP、Java、C++、.Net等,还有ODBC接⼝,同样⽐起 Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度⽐他们都快。

2.SQLite的特点:轻量级SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。

使⽤SQLite⼀般只需要带上它的⼀个动态库,就可以享受它的全部功能。

⽽且那个动态库的尺⼨也挺⼩,以版本3.6.11为例,Windows下487KB、Linux下347KB。

不需要"安装"SQLite的核⼼引擎本⾝不依赖第三⽅的软件,使⽤它也不需要"安装"。

有点类似那种绿⾊软件。

单⼀⽂件数据库中所有的信息(⽐如表、视图等)都包含在⼀个⽂件内。

这个⽂件可以⾃由复制到其它⽬录或其它机器上。

跨平台/可移植性除了主流操作系统 windows,linux之后,SQLite还⽀持其它⼀些不常⽤的操作系统。

弱类型的字段同⼀列中的数据可以是不同类型开源3.SQLite数据类型⼀般数据采⽤的固定的静态数据类型,⽽SQLite采⽤的是动态数据类型,会根据存⼊值⾃动判断。

SQLite具有以下五种常⽤的数据类型:NULL: 这个值为空值VARCHAR(n):长度不固定且其最⼤长度为 n 的字串,n不能超过 4000。

CHAR(n):长度固定为n的字串,n不能超过 254。

INTEGER: 值被标识为整数,依据值的⼤⼩可以依次被存储为1,2,3,4,5,6,7,8.REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.TEXT: 值为⽂本字符串,使⽤数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).BLOB: 值是BLOB数据块,以输⼊的数据格式进⾏存储。

Qt学习资料

Qt学习资料

Qt学习资料1. 介绍QML是一种描述语言,主要是对界面效果等的一种描述,它可以结合javaScript来进行更复杂的效果及逻辑实现。

比如做个游戏,实现一些更有趣的功能等2. 简单的例子import Qt4.7Rectangle{width:200height:200color:"blue"}代码是绘制一个蓝色的矩形,宽200 高200,import包含一个qt4.7的包3.基本元素的介绍(自己翻译意思会有出入,敬请见谅)基本可视化项Item 基本的项元素在QML中所有可视化的向都继承他Rectangle 基本的可视化矩形元素Gradient 定义一个两种颜色的渐变过程GradientStop 定义个颜色,被Gradient使用Image 在场景中使用位图BorderImage(特殊的项) 定义一张图片并当做边界AnimatedImage 为播放动画存储一系列的帧Text 在场景中使用文本TextInput 显示可编辑为文本IntValidator int 验证器DoubleValidator double 验证器RegExpValidator 验证字符串正则表达式TextEdit 显示多行可编辑文本基本的交互项MouseArea 鼠标句柄交互FocusScope 键盘焦点句柄Flickable 提供一种浏览整张图片的一部分的效果,具体看例子Flipable 提供一个平面,可以进行翻转看他的前面或后面,具体看例子状态State 定义一个配置对象和属性的集合PropertyChanges 使用一个State描述属性的改变StateGroup 包含一个状态集合和状态变换ParentChange 重新定义父集,也就是换个父节点AnchorChanges 在一个状态中改变anchors动画和变换Behavior 默认的属性变换动画SequentialAnimation 对定义的动画串行播放ParallelAnimation 对定义的动画并行播放PropertyAnimation 属性变换动画NumberAnimation 对实数类型属性进行的动画Vector3dAnimation 对QVector3d进行的属性ColorAnimation 颜色进行的变换动画RotationAnimation 对旋转进行的变换动画ParentAnimation 对父节点进行变换的动画,改变绑定的父节点AnchorAnimation 对anchor 进行改变的动画PauseAnimation 延迟处理SmoothedAnimation 允许属性平滑的过度SpringAnimation 一种加速的效果PropertyAction 允许在动画过程中对属性的直接改变ScriptAction 允许动画过程中调用脚本Transition 在状态变换中加入动作变化工作中的数据Binding 在创建的时候绑定一些数据到一些属性ListModel 定义链表数据ListElement 定义ListModel的一个数据项VisualItemModel 包含可视化项(visual items)到一个view中,相当是一个容器VisualDataModel 包含一个model和一个delegate,model包含需要的数据,delegate设计显示的项的信息,具体的去看例子Package 他的目的是把VisualDataModel共享给多个view,具体还要学习XmlListModel 特殊的一个模式使用XPath表达式,使用xml来设置元素,参考例子XmlRole XmlListModel的一个特殊的角色视图ListView 提供一个链表显示模型视图GridView 提供一个网格显示模型视图PathView 提供一个内容沿着路径来显示的模型Path 定义一个PathView使用的轨迹PathLine 定义一个线性的轨迹PathQuad 定义一个二次贝塞尔曲线的轨迹PathCubic 定义一个三次贝塞尔曲线的轨迹PathAttribute允许绑定一个属性上,具体看例子PathPercent 修改item分配的轨迹不是很明了其中的意思WebView 允许添加网页内容到一个canvas上定位器Column 整理它的子列(纵)Row 整理它的子行(横)Grid 设置它的子到一个网格上Flow 目的是不让他的子项重叠在一起实用Connections 明确连接信号和信号句柄Component 封装QML items 想一个组件一样Timer 提供时间触发器QtObject 基本的元素只包含objectName属性Qt qml全局Qt object提供使用的枚举和函数WorkerScript允许在QML使用线程Loader 控制载入item或组件Repeater 使用一个模型创建多个组件SystemPalette 为Qt palettes提供一个通道FontLoader 载入字体根据名字或URLLayoutItem 允许声明UI元素插入到qtGraphicsView 布局中变换Scale 分派item 缩放行为Rotation 分派item 旋转行为Translate 分派item 移动行为4.基本元素的使用例子1. Item位置是0,0 宽高分别是200Item{x:0;y:0;width:200;height:200;}2. Rectangle位置是:0,0宽高分别是200,颜色是红色Rectangle{x: 0; y: 0;width: 200; height: 200;color: "red"}3.Gradient GradientStop分别在总高度的0 颜色红色总高度的1/3 黄色总高度的1是绿色Rectangle{width:100;height:100gradient:Gradient{GradientStop{position:0.0;color:"red"}GradientStop{position:0.33;color:"yellow"}GradientStop{position:1.0;color:"green"}}}4.Image设置一张图片Image{source:"../Images/button1.png"}5.BorderImage他将一张图片分成9部分当图片进行缩放的时候A.1 3 7 9 位置的都不会进行缩放B. 2 8将根据属性horzontalTileMode 进行缩放C.4 6 将根据属性verticalTileMode 进行缩放D.5 将根据属性horzontalTileMode 和verticalTileMode 进行缩放BorderImage{width:180;height:180//分割1~9块的4个点是根据border设置的坐标来实现的//本别是距离坐标上边右边下边的距离border{left:30;top:30;right:30;bottom:30}horizontalTileMode:BorderImage.StretchverticalTileMode:BorderImage.Stretchsource:"../Images/button1.png"}6.AnimatedImage主要用于播放gif图片Rectangle{width:animation.width;height:animation.height+8AnimatedImage{id:animation;source:"animation.gif"}Rectangle{property int frames:animation.frameCountwidth:4;height:8x:(animation.width-width)*animation.currentFrame/frames y:animation.heightcolor:"red"}}7.Text显示文本(具体的其他设置请看文档)Text{text:"text"}8.TextInput下面是设置一个输入文本框,框中的字符串是Text, 并设置鼠标可以选择文本TextInput{text:"Text"selectByMouse:true;//鼠标可以选择}9.IntValidator int 型验证器,和输入框结合后就是只能输入整型数据T extInput{//最高可以输入100,最低输入10IntValidator{id:intval;bottom:10;top:100;}width:100;height:20;text:"";//使用校验器validator:intval;}10.DoubleValidator只能输入浮点数TextInput{//最高可以输入100,最低输入10decimals最多有多少位小数//notation表示是使用科学计数法还是(默认),还是直接的小数当获取里面的数据DoubleValidator{id:intval;decimals:4;bottom:10;top:100;nota tion:DoubleValidator.StandardNotation}width:100;height:20;text:"";//使用校验器validator:intval;}11.RegExpValidator使用正则表达式TextInput{//使用一个正则表达式来控制输入的字符串///^[a-zA-Z]{1}[0-1]{0,2}[a-z]{1,3}$/表示开始位置必须是一个大写或小写字母//接下来是0~2个的数字而且是0或1,在接下来是1~3个的小写字母RegExpValidator{id:intval;regExp:/^[a-zA-Z]{1}[0-1]{0,2}[a-z]{1,3}$/;}width:100;height:20;text:"";//使用校验器validator:intval;}12.TextEdit显示一段hello world的html文本和TextInput相同TextEdit{width:240text:"Hello World!"font.family:"Helvetica"font.pointSize:20color:"blue"focus:true}13.MouseArea主要是用来判断鼠标事件的区域Rectangle{x:0;y:0;width:100;height:100;Rectangle{id:mousrectx:20;y:20;width:20;height:20;color:"blue"MouseArea{//使用父的区域作为鼠标判断的区域及x:20;y:20;width:20;height: 20;anchors.fill:parent;//但鼠标按下后mousrect变成红色,当鼠标松开后变成蓝色onPressed:{mousrect.color="red";}onReleased:{mousrect.color="blue";}}}}14.FocusScope不是很清楚说的什么,好像是说同一个时刻只有一个item有焦点15.Flickable显示一个200x200的框,框中显示图片上200x200的部分Flickable{width:200;height:200//设置使用图片的宽高,而现实的是200x200的现实框contentWidth:image.width;contentHeight:image.heightImage{id:image;source:"../Images/need.png"}}16.Flipable包含两个面,一个前面,一个后面,实现一个控件前后的翻转效果,并且在后面可以添加一些控制Flipable{id:flipablewidth:240height:240property int angle:0property bool flipped:falsefront:Image{source:"front.png"}//前面back:Image{source:"back.png"}//后面//旋转动画前后面交换transform:Rotation{origin.x:flipable.width/2;origin.y:flipable.height/2axis.x:0;axis.y:1;axis.z:0//rotate around y-axisangle:flipable.angle}states:State{name:"back"PropertyChanges{target:flipable;angle:180}when:flipable.flipped}transitions:Transition{NumberAnimation{properties:"angle";duration:1000}}MouseArea{anchors.fill:parentonClicked:flipable.flipped=!flipable.flipped}}17.State//当鼠标按下后改变myRect的颜色Rectangle{id:myRectwidth:100;height:100color:"black"MouseArea{id:mouseAreaanchors.fill:parentonClicked:myRect.state=='clicked'?myRect.state="":myRect. state= 'clicked';}//设置状态states:[State{name:"clicked"PropertyChanges{target:myRect;color:"red"}}]}18.PropertyChanges//当鼠标按下后改变状态//状态里面的属性改变包含了文本和颜色的改变Text{id:myTextwidth:100;height:100text:"Hello"color:"blue"states:State{name:"myState"//当这个状态被设置的时候,将改变myText的文本和颜色PropertyChanges{target:myTexttext:"Goodbye"color:"red"}}MouseArea{anchors.fill:parent;onClicked:myText.state='myS tate'} }19.StateGroup一个状态组中可以包含很多的状态和变化,而状态也可以和变换绑定. 20.StateChangeScript在状态中可以对脚本中的函数进行调用// Sc.jsfunction changeColor() // 返回蓝色{return "blue";}// test.qmlimport"Sc.js"as CodeRectangle{id:rectwidth:50;height:50color:"red"MouseArea{anchors.fill:parentonClicked:rect.state="first" // 鼠标按下改变状态}states:State{name:"first"; StateChangeScript{name:"myScript";script:rect.color=Code.changeColor();}}}21.ParentChang把指定的item换一个item父节点Item{width:200;height:100Rectangle{id:redRectwidth:100;height:100color:"red"}//本来blueRect的父节点是Item当鼠标按下后他被设置到redRect上Rectangle{id:blueRectx:redRect.widthwidth:50;height:50color:"blue"states:State{name:"reparented"//改变父节点ParentChange{target:blueRect;parent:redRect;x:10;y:10}}MouseArea{anchors.fill:parent;onClicked:blueRect.state="re parented"} }}22.AnchorChangesRectangle{id:windowwidth:120;height:120color:"black"Rectangle{id:myRect;width:50;height:50;color:"red"}states:State{name:"reanchored"AnchorChanges{//改变myRect的anchors属性target:myRectanchors.top:window.topanchors.bottom:window.bottom}PropertyChanges{target:myRectanchors.topMargin:10anchors.bottomMargin:10}}//鼠标事件MouseArea{anchors.fill:parent;onClicked:window.state="rea nchored"} }23.BehaviorRectangle{id:rectwidth:100;height:100color:"red"//针对宽度的动画Behavior on width{NumberAnimation{duration:1000}}MouseArea{anchors.fill:parentonClicked:rect.width=50}}24.SequentialAnimation串行播放多个动画Rectangle{id:rect1width:500;height:500Rectangle{id:rect;color:"red"width:100;height:100//串行播放多个动画,先横向移动,在纵向移动SequentialAnimation{running:true;NumberAnimation{target:rect;properties:"x";to:50;duration: 1000}NumberAnimation{target:rect;properties:"y";to:50;duration:1000 } }}}25.ParallelAnimationRectangle{id:rect1width:500;height:500Rectangle{id:rect;color:"red"width:100;height:100//并行播放动画,同时横向和纵向移动ParallelAnimation{running:true;NumberAnimation{target:rect;properties:"x";to:50;duration: 1000}NumberAnimation{target:rect;properties:"y";to:50;duration:1000 } }}}26.PropertyAnimationRectangle{id:rectwidth:100;height:100color:"red"。

qt实训日志

qt实训日志

qt实训日志一、前言本篇文章是我在QT实训期间的日志记录,主要记录了我在学习和实践中的思考和收获,以及遇到的问题和解决方法。

二、学习内容1. QT基础知识在开始实训之前,我们首先学习了QT的基础知识,包括QT的安装、界面设计、信号与槽机制等。

其中,信号与槽机制是QT最重要的特性之一,它可以将不同对象之间的交互行为进行解耦,使得代码更加清晰和易于维护。

2. QT网络编程随着互联网技术的发展,网络编程已经成为了一项非常重要的技能。

在QT实训中,我们也学习了QT网络编程相关知识,包括TCP/IP协议、Socket编程等。

通过这些知识的学习和实践,我们能够更加深入地理解网络编程的本质,并且能够独立完成基本的网络应用开发。

3. QT数据库开发数据库是现代软件开发中不可或缺的一部分。

在QT实训中,我们也学习了QT数据库开发相关知识,并且使用SQLite作为数据库进行实践。

通过这些知识的学习和实践,我们能够更加深入地了解数据库的设计和使用,以及如何在QT中进行数据库操作。

三、实践项目1. 聊天室聊天室是我们在QT实训中完成的第一个项目。

通过这个项目,我们学习了QT网络编程相关知识,并且实现了一个基本的聊天室应用。

在这个项目中,我们使用了TCP/IP协议进行通信,并且使用了QT的信号与槽机制来处理用户输入和服务器响应。

2. 学生成绩管理系统学生成绩管理系统是我们在QT实训中完成的第二个项目。

通过这个项目,我们学习了QT数据库开发相关知识,并且实现了一个基本的学生成绩管理系统。

在这个项目中,我们使用了SQLite作为数据库,并且使用了QT的模型/视图框架来显示数据。

3. 图书馆管理系统图书馆管理系统是我们在QT实训中完成的第三个项目。

通过这个项目,我们进一步深入地学习了QT数据库开发相关知识,并且实现了一个复杂的图书馆管理系统。

在这个项目中,我们不仅使用了SQLite 作为数据库,还使用了多线程编程来提高程序性能。

QSQLite 数据库

QSQLite 数据库

这里我们只是演示了一下使用这个框架完成最简单的程序的过程,只起到抛砖引玉的作用。

这个框架很复杂,但是功能也很强大,Qt Creator中自带了几个相关的例子(在帮助中查找Graphics View Examples即可),你可以参考一下。

因为篇幅问题,我们就只讲这么多,如果以后有机会,我会推出一个相关的专题来讲述这个框架。

分类:Qt系列教程作者: yafeilinux 日期:四月 30th, 2010. 3,006 viewsTags: 2D绘图, creator, qt, yafeilinux, 教程二十一、Qt数据库(一)简介本文章原创于转载请注明出处。

从今天开始我们学习Qt数据库编程的内容。

先说明:我们以后使用现在最新的基于Qt 4.6.2的Qt Creator 1.3.1 Windows版本,该版本是2010年2月17日发布的。

数据库几乎是每个较大的软件所必须应用的,而在Qt中也使用QtSql模块实现了对数据库的完美支持。

我们在Qt Creator的帮助中查找QtSql Module,其内容如下图:可以看到这个模块是一组类的集合,使用这个模块我们需要加入头文件#include <QtSql>,而在工程文件中需要加入一行代码:QT += sql这里每个类的作用在后面都有简单的介绍,你也可以进入其中查看其详细内容。

下面我们先简单的说一下QSqlDatabase类和QSqlQuery类。

QSqlDatabase类实现了数据库连接的操作,现在Qt支持的数据库类型有如下几种:而现在我们使用的免费的Qt只提供了SQLite和ODBC数据库的驱动(我们可以在Qt Creator 安装目录下的qt\plugins\sqldrivers文件夹下查看),而其他数据库的驱动需要我们自己添加。

SQLite是一个小巧的嵌入式数据库,关于它的介绍你可以自己在网上查找。

QSqlQuery类用来执行SQL语句。

sqlite 指南pdf

sqlite 指南pdf

sqlite 指南SQLite是一个C库,实现了轻量级的关系型数据库系统。

以下是SQLite的指南:1. 安装:首先需要下载并安装SQLite库。

可以从SQLite官网下载最新版本的SQLite源代码,并按照说明进行编译和安装。

2. 创建数据库:使用sqlite3命令行工具可以创建一个新的数据库文件。

例如,在命令行中输入“sqlite3 mydatabase.db”将创建一个名为“mydatabase.db”的数据库文件。

3. 创建表:在SQLite中,可以使用CREATE TABLE语句创建表。

例如,“CREATE TABLE mytable (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);”将创建一个名为“mytable”的表,包含id、name和age 三个字段。

4. 插入数据:可以使用INSERT INTO语句向表中插入数据。

例如,“INSERT INTO mytable (name, age) VALUES ('John', 25);”将在“mytable”表中插入一条记录,包含name和age两个字段的值。

5. 查询数据:可以使用SELECT语句查询表中的数据。

例如,“SELECT * FROM mytable WHERE age > 20;”将查询“mytable”表中年龄大于20的所有记录。

6. 更新数据:可以使用UPDATE语句更新表中的数据。

例如,“UPDATE mytable SET age = 30 WHERE name = 'John';”将更新“mytable”表中name字段为“John”的记录的age字段为30。

7. 删除数据:可以使用DELETE语句删除表中的数据。

例如,“DELETE FROM mytable WHERE name = 'John';”将删除“mytable”表中name字段为“John”的所有记录。

在Qt中使用SQLite数据库

在Qt中使用SQLite数据库

在Qt中使⽤SQLite数据库前⾔SQLite(sql)是⼀款开源轻量级的数据库软件,不需要server,可以集成在其他软件中,⾮常适合嵌⼊式系统。

Qt5以上版本可以直接使⽤SQLite(Qt⾃带驱动)。

⽤法1 准备1. 引⼊SQL模块在Qt项⽬⽂件(.pro⽂件)中,加⼊SQL模块:QT += sql2. 引⽤头⽂件在需要使⽤SQL的类定义中,引⽤相关头⽂件。

例如:#include <QSqlDatabase>#include <QSqlError>#include <QSqlQuery>2 使⽤1. 建⽴数据库检查连接、添加数据库驱动、设置数据库名称、数据库登录⽤户名、密码。

QSqlDatabase database;if (QSqlDatabase::contains("qt_sql_default_connection")){database = QSqlDatabase::database("qt_sql_default_connection");}else{database = QSqlDatabase::addDatabase("QSQLITE");database.setDatabaseName("MyDataBase.db");database.setUserName("XingYeZhiXia");database.setPassword("123456");}上述代码解释:(1)第⼀⾏中,建⽴了⼀个QSqlDatabase对象,后续的操作要使⽤这个对象。

(2)if语句⽤来检查指定的连接(connection)是否存在。

这⾥指定的连接名称(connection name)是qt_sql_default_connection,这是Qt默认连接名称。

qt连接数据库的方法

qt连接数据库的方法

qt连接数据库的方法1. 简介Qt是一个跨平台的开发框架,提供了丰富的GUI控件和易于使用的API。

它也支持与各种数据库的连接。

在本篇文章中,我们将介绍Qt如何连接数据库。

我们将涵盖Qt 支持的各种数据库类型,例如SQLite、MySQL和PostgreSQL等。

2. SQLite数据库连接SQLite是一个轻量级的关系型数据库,可以在任何平台上使用,并且无需安装。

以下是Qt连接SQLite数据库的示例代码:```cppinclude <QCoreApplication>include <QtSql>int main(int argc, char *argv[]){QCoreApplication a(argc, argv);QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("test.db");if (!db.open()){qDebug() << "Failed to connect to database.";return 1;}qDebug() << "Database connected successfully.";// Do some database-related work heredb.close();return a.exec();}```在上面的示例中,我们首先使用`QSqlDatabase::addDatabase()`函数创建一个数据库连接,然后使用`setDatabaseName()`函数指定要连接的数据库文件的名称。

如果连接成功,则应该输出“Database connected successfully.”,否则输出“Failed to connect to database.”。

qt使用以及sqlitebrowser的安装

qt使用以及sqlitebrowser的安装

先创建一个名为test.db的数据库创建命令为sqlite3 test.db他的功能为创建数据库与显示sqite 的版本号。

创建表mtable 里面包含学号,姓名年龄。

创建方法。

输入命令: create table mytable(id,name,age);创建好了表,并向表中插入数据。

Insert into mytable(id,name,age) values(1,"zhangsan","20"); 查看表的内容:Select * from mytable执行命令:.mode column (注意没有分号),设置为列显示模式.mode columnSelect * from mytable执行命令退出数据库进入数据库执行命令:.tables 可以看到该数据库内有一个表文件执行命令:.databases 查看数据库信息安装可视化数据库工具sqlitebrowser安装方法:文件的云盘位置:/s/1eQu0UAI下载;进入下载文件的目录并进行显示:显示文件信息:ls -al 命令这里sqlitebrowser 文件的所属者没有执行的权利,root用户也没有。

则这两个用户不能执行这个可执行文件。

你可以两个都试试.呵呵!我表示试过。

所以我这里要修改使用者权限.chmod u+x sqlitebrowser显示文件信息ls -l sqlitebrowser修改完成了,用户有执行权限了。

我们可以尽情玩耍了!执行命令吧!安装好了并且打开输入: ./sqlitebrowser& 表示后台运行这个退出需要kill +pid(进程号)./sqlitebrowser 表示非后台运行需要ctrl +c 才能退出这个方法要在该目录下也就是在/student/下载目录下才能运行若想要在别的目录下也能运行,这要把可执行文件sqlitebrowser 移动到/usr/bin/ 目录下(这里大家自己百度吧!。

SQLite数据库利用详解程序

SQLite数据库利用详解程序

1.SQLite数据库的优势:1.1 轻量级SQLite和C/S模式的数据库软件不同,它是进程内的数据库引擎,利用SQLite一样只需要带上它的一个动态库。

以版本为例,Windows下487KB、Linux下347KB。

1.2 绿色软件它的核心引擎本身不依托第三方的软件1.3 单一文件确实是数据库中所有的信息(比如表、视图、触发器、等)都包括在一个文件内。

那个文件能够copy到其它目录或其它机械上,也照用不误。

CSV也是单一文件格式。

它本身确实是用来表示二维的数据信息的。

一个CSV文件能够明白得为数据库的一张表。

CSV的缺点要紧在于:不便于存储非文本的数据信息(比如BLOB类型的信息);若是需要同时存储多张表的信息,就需要对应有多个CSV文件(文件一多,就嫌麻烦)。

1.4 跨平台/可移植性除主流操作系统,SQLite还支持了很多其他的操作系统。

如对很多嵌入式系统(比如Android、Windows Mobile、Symbin、Palm、VxWorks等)的支持。

Access数据库最要紧的缺点确实是不能跨平台。

另外还有几个小缺点:文件大小有限制(2GB)、不支持内存数据库。

1.5 内存数据库(in-memory database)现在内存愈来愈廉价,很多一般PC都开始以GB为单位来衡量内存(效劳器就更甭提了)。

这时,SQLite的内存数据库特性就越发显得好用。

SQLite的API不区分当前操作的数据库是在内存仍是在文件(关于存储介质是透明的)。

因此若是你感觉磁盘I/O有可能成为瓶颈的话,能够考虑切换为内存方式。

切换的时候,操作SQLite的代码大体不用大改,只要在开始时把文件Load到内存,终止时把内存的数据库Dump回文件就OK了。

1.6 编程语言接口由于SQLite本身是C写的,它自带的API也是C接口的。

2.SQLite数据库的缺点:2.1并发访问的锁机制SQLite在并发(包括多进程和多线程)读写方面的性能不太理想。

qt sqlite 数组

qt sqlite 数组

qt sqlite 数组
在Qt中使用SQLite数据库存储数组需要一些特殊的处理方法。

SQLite本身并不直接支持数组类型,但可以通过将数组转换为字符
串存储在数据库中,或者使用多个表来模拟数组的存储。

一种常见的方法是将数组转换为逗号分隔的字符串,然后将其
存储在数据库的一个字段中。

在读取数据时,再将字符串分割为数组。

这种方法简单直接,但需要在应用程序中进行字符串和数组的
转换操作。

另一种方法是使用多个表来模拟数组的存储。

例如,可以创建
一个主表存储数组的其他属性,然后创建一个关联表来存储数组的
元素,通过外键关联两个表。

这种方法需要更多的表设计和数据库
操作,但能更好地支持数组的增删改查操作。

在Qt中操作SQLite数据库,可以使用Qt提供的QtSql模块。

首先需要使用QSqlDatabase来连接数据库,然后执行SQL语句来创
建表、插入数据、查询数据等操作。

对于数组的存储和操作,可以
通过QString来表示数组,并在应用程序中进行字符串和数组的转
换操作,或者通过多个表来模拟数组的存储。

总之,在Qt中使用SQLite存储数组需要根据具体的需求和数据结构选择合适的方法,然后通过QtSql模块来操作数据库实现相应的功能。

希望这些信息能对你有所帮助。

pyqt+sqlite使用实例

pyqt+sqlite使用实例

pyqt+sqlite使用实例以下是一个使用 PyQt 和 SQLite 的基本实例。

在这个例子中,我们将创建一个简单的数据库,并创建一个用户界面让用户可以输入和查看数据。

首先,我们需要导入必要的模块并创建数据库连接。

pythonimport sqlite3from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QLineEdit, QLabel, QGridLayout, QTableWidget, QTableWidgetItemfrom PyQt5.QtCore import Qtclass DBController():def __init__(self):self.conn = sqlite3.connect('my_database.db')self.cursor = self.conn.cursor()self.cursor.execute('''CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEYAUTOINCREMENT,name TEXT NOT NULL,email TEXT NOT NULL UNIQUE);''')接下来,我们创建一个简单的用户界面。

这里只展示了部分代码,更多细节可以自己完善。

pythonclass UserInterface(QWidget):def __init__(self, db_controller):super().__init__()self.db_controller = db_controllerself.initUI()def initUI(self):layout = QVBoxLayout()self.setLayout(layout)layout.addWidget(QPushButton('Add User', self))layout.addWidget(QPushButton('View Users', self))self.setLayout(layout)然后我们定义两个按钮的点击事件,分别用于添加用户和查看用户。

qsqldatabase sqlite 多线程用法

qsqldatabase sqlite 多线程用法

qsqldatabase sqlite 多线程用法在使用 Qt 中的 QSqlDatabase 连接 SQLite 数据库时,如果涉及到多线程操作,需要特别注意数据库连接的管理和线程安全性。

以下是在多线程环境中使用QSqlDatabase 连接SQLite 数据库的一些建议:1. 每个线程拥有独立的数据库连接:在多线程应用程序中,最好为每个线程创建独立的数据库连接。

这样可以确保在不同线程间不会共享数据库连接,从而避免潜在的线程安全问题。

// 在每个线程中创建独立的数据库连接QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "connectionName");db.setDatabaseName("databaseName.sqlite");db.open();2. 管理连接和关闭:确保在每个线程中适时地打开和关闭数据库连接。

可以通过连接的 isOpen() 方法检查连接的状态,并使用 close() 方法关闭连接。

QSqlDatabase db = QSqlDatabase::database("connectionName");if (!db.isOpen()) {if (db.open()) {// 连接成功打开} else {// 连接打开失败}}// 使用数据库连接进行数据库操作db.close(); // 在适当的时候关闭连接3. 线程间通信:如果需要在不同线程之间共享数据库连接的信息,考虑使用Qt 的信号和槽机制或者其他线程安全的通信方式。

4. 异步查询:如果需要在后台执行长时间运行的查询,可以考虑使用异步查询,以避免阻塞主线程。

示例代码:以下是一个简单的示例,演示如何在多线程中使用QSqlDatabase 连接 SQLite 数据库:#include <QSqlDatabase>#include <QSqlQuery>#include <QThread>class WorkerThread : public QThread {void run() override {// 在每个线程中创建独立的数据库连接QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "connectionName");db.setDatabaseName("databaseName.sqlite");if (db.open()) {QSqlQuery query(db);query.exec("SELECT * FROM tableName");while (query.next()) {// 处理查询结果}db.close();}}};int main() {WorkerThread thread1;WorkerThread thread2;// 启动线程thread1.start();thread2.start();// 等待线程完成thread1.wait();thread2.wait();return 0;}这个示例中,每个线程都有独立的数据库连接,并在其运行期间执行数据库查询。

SQLite学习手册 中文全本

SQLite学习手册 中文全本

SQLite学习手册内容收集自网络整理:zhoushuangsheng@新浪微博:@_Nicky开篇一、简介:SQLite是目前最流行的开源嵌入式数据库,和很多其他嵌入式存储引擎相比(NoSQL),如BerkeleyDB、MemBASE等,SQLite可以很好的支持关系型数据库所具备的一些基本特征,如标准SQL语法、事务、数据表和索引等。

事实上,尽管SQLite拥有诸多关系型数据库的基本特征,然而由于应用场景的不同,它们之间并没有更多的可比性。

下面我们将列举一下SQLite的主要特征:1. 管理简单,甚至可以认为无需管理。

2. 操作方便,SQLite生成的数据库文件可以在各个平台无缝移植。

3. 可以非常方便的以多种形式嵌入到其他应用程序中,如静态库、动态库等。

4. 易于维护。

综上所述,SQLite的主要优势在于灵巧、快速和可靠性高。

SQLite的设计者们为了达到这一目标,在功能上作出了很多关键性的取舍,与此同时,也失去了一些对RDBMS关键性功能的支持,如高并发、细粒度访问控制(如行级锁)、丰富的内置函数、存储过程和复杂的SQL语句等。

正是因为这些功能的牺牲才换来了简单,而简单又换来了高效性和高可靠性。

二、SQLite的主要优点:1. 一致性的文件格式:在SQLite的官方文档中是这样解释的,我们不要将SQLite与Oracle或PostgreSQL去比较,而是应该将它看做fopen和fwrite。

与我们自定义格式的数据文件相比,SQLite不仅提供了很好的移植性,如大端小端、32/64位等平台相关问题,而且还提供了数据访问的高效性,如基于某些信息建立索引,从而提高访问或排序该类数据的性能,SQLite提供的事务功能,也是在操作普通文件时无法有效保证的。

2. 在嵌入式或移动设备上的应用:由于SQLite在运行时占用的资源较少,而且无需任何管理开销,因此对于PDA、智能手机等移动设备来说,SQLite的优势毋庸置疑。

qsqlite详解

qsqlite详解

qsqlite详解1. 介绍qsqlite是一个基于Qt框架的轻量级数据库驱动程序,用于访问SQLite数据库。

SQLite是一个嵌入式的关系型数据库管理系统,具有小巧、快速和易于使用的特点。

qsqlite将SQLite的功能封装为Qt的插件,使得在Qt应用程序中操作SQLite数据库变得更加简单方便。

qsqlite提供了一套简洁的API,可以执行各种数据库操作,如创建和删除表、插入、更新和删除数据、执行查询等。

它还支持事务处理、预编译SQL语句、批量操作等高级特性。

通过qsqlite,开发者可以方便地将SQLite数据库集成到Qt应用程序中,从而实现数据存储和管理的功能。

2. 安装和配置2.1 安装qsqlite插件要使用qsqlite,首先需要安装Qt开发环境。

在安装Qt时,可以选择安装带有SQLite插件的版本,也可以后续通过Qt Maintenance Tool安装插件。

2.2 配置项目文件在项目文件(.pro)中添加以下代码,以启用qsqlite插件:QT += sqlQT += sql-sqlite3. 建立数据库连接在使用qsqlite进行数据库操作之前,需要先建立与数据库的连接。

可以使用QSqlDatabase类来管理数据库连接。

下面是一个建立数据库连接的示例代码:QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("mydatabase.db"); // 设置数据库文件名if (!db.open()) {// 连接失败处理} else {// 连接成功处理}4. 执行SQL语句使用qsqlite可以执行各种SQL语句,如创建表、插入数据、更新数据、删除数据等。

可以通过QSqlQuery类来执行SQL语句和获取执行结果。

4.1 创建表QSqlQuery query;query.exec("CREATE TABLE IF NOT EXISTS Students (id INT PRIMARY KEY, name TEXT, age INT)");上述代码创建了一个名为”Students”的表,包含id、name和age三个字段。

Qt数据库总结[精选五篇]

Qt数据库总结[精选五篇]

Qt数据库总结[精选五篇]第一篇:Qt数据库总结Qt数据库总结#include QT += sql QSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类封装数据库所有记录第一:QSqlDatabase类QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);采用QSQLITE数据库,QMYSQL数据库有问题?db.setHostName(“localhost”);//设置数据库主机名db.setDatabaseName(“test”);//设置数据库名db.setUserName(“root”);//设置数据库登入用户名db.setPassword(“123456”);//设计数据库登入密码db.open()打开数据库连接 db.close();//释放数据库QStringList drivers = QSqlDatabase::drivers();//静态成员函数,是类的成员函数,不是对象的.返回所有可用的数据库驱动程序的清单drivers.removeAll(“QMYSQL3”);//删除列表中的项foreach(QString driver, drivers)//遍历数据库驱动,测试数据库驱动种类qDebug()<< “t” << driver;建立数据库文件QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);db.setDatabaseName(“database.db”);if(!db.open())return false;QSqlQuery query;query.exec(“create table Login(id INTEGER PRIMARY KEY autoincrement, ” //id会自动增加,因为这里不能重复,否则数据库无法修改“goods int, store int, time nvarchar(50), type int, place nvarchar(50),temperature nvarchar(10))”);//query.exec(“insert into Login values(1,1002, 1,'2011-9-6',1,'common',24)”);// query.exec(“insert into Login values(2,1005, 1,'2011-9-6',1,'common',24)”);//query.exec(“insert into Login values(3,1010, 2,'2011-9-7',2,'common',25)”);//query.exec(“insert into Login values(4,1012, 2,'2011-9-7',2,'common',25)”);query.exec(“insert into Login values(1,NULL , NULL,NULL, NULL,NULL,NULL)”);query.exec(“insert into Login values(2,NULL , NULL,NULL, NULL,NULL,NULL)”);query.exec(“insert into Login values(3,NULL , NULL,NULL, NULL,NULL,NULL)”);query.exec(“insert into Login values(4,NULL , NULL,NULL, NULL,NULL,NULL)”);query.exec(“insert into Login values(5,NULL , NULL,NULL, NULL,NULL,NULL)”);query.exec(“insert into Login val ues(6,NULL , NULL,NULL, NULL,NULL,NULL)”);第二:QSqlQuery类,查询数据库,插入值到数据库等操作数据库QSqlQuery query;query.prepare(“INSERT INTO T_USER(name, age)VALUES(:name, :age)”);//准备执行SQL查询query.bindValue(“:name”, “justin”);//在这定占位符上确定绑定的值query.bindValue(“:age”, 33);query.exec();QSqlQuery query;//以下执行相关QSL语句query.exec(“create table student(id int primary key,name varchar)”);//新建student表,id设置为主键,还有一个name项query.exec(“insert into student values(1,’xiaogang’)”);query.exec(“insert into student values(2,’xiaoming’)”);query.exec(“insert into student values(3,’xiaohong’)”);//向表中插入3条记录query.exec(“select * from student”);来查询出表中所有的内容。

qsqlite详解

qsqlite详解

QSQLite 是Qt 框架中的一个模块,用于在应用程序中进行SQLite 数据库的操作。

SQLite 是一种轻量级的嵌入式数据库引擎,它提供了一个自包含、零配置的、事务性的关系型数据库管理系统。

QSQLite 模块使开发者能够轻松地在Qt 应用程序中使用SQLite 数据库。

QSQLite 模块提供了一组类和函数,用于创建、连接、查询和管理SQLite 数据库。

主要的类包括:QSqlDatabase:用于建立和管理数据库连接的类。

通过该类,可以指定数据库驱动程序和连接参数来创建数据库连接对象。

QSqlQuery:用于执行SQL 查询和管理结果集的类。

通过该类,可以执行各种SQL 语句(如查询、插入、更新、删除等),并获取查询结果。

QSqlTableModel:用于与数据库表格进行交互的模型类。

通过该类,可以在Qt 的视图组件(如QTableView)中显示数据库表格的数据,并进行增删改查等操作。

使用QSQLite 进行数据库操作的一般流程如下:创建数据库连接:使用QSqlDatabase 类创建一个数据库连接对象,并指定数据库驱动程序和连接参数。

打开数据库连接:通过调用数据库连接对象的open() 方法,打开与数据库的连接。

执行SQL 查询:使用QSqlQuery 类执行SQL 查询语句,可以通过exec() 方法执行查询语句,或者使用prepare() 和bindValue() 方法执行带参数的查询。

处理查询结果:通过next() 方法遍历查询结果集,使用相关方法获取和处理查询结果。

关闭数据库连接:在使用完数据库连接后,通过调用数据库连接对象的close() 方法,关闭与数据库的连接。

QSQLite 提供了简洁而强大的接口,使得在Qt 应用程序中使用SQLite 数据库变得简单和高效。

通过QSQLite,开发者可以轻松地进行数据库操作,包括创建数据库、执行查询、更新数据等。

同时,Qt 的信号槽机制和模型视图架构也使得数据的显示和交互更加方便和灵活。

QT创建本地数据库(SQLite数据库)存储数据

QT创建本地数据库(SQLite数据库)存储数据

QT创建本地数据库(SQLite数据库)存储数据注意:QT⾃带SQLITE数据库,不需要再安装1.创建⼀个包含创建、查询、修改和删除数据库的数据库类(DataBase)DataBase.h头⽂件#pragma once#include <QObject>#include <QtSql/QSqlDatabase>#include <QtSql/QSqlQuery>#include <QtSql/QSqlDriver>#include <QtSql/QSqlError>struct StudentData{ QString name; int score; QString grade;};class DataBase : public QObject{Q_OBJECTpublic:DataBase(QString name,QObject *parent=0);~DataBase();public:bool insertData(StudentData data);bool deleteData(QString name);bool getDataByName(int name, StudentData & data);bool getDataList(QList<StudentData> & list); bool update();private:QSqlDatabase m_DataBase;private:bool initTable();bool isExistTable(QString table);bool createTable(QString table);};DataBase.cpp源⽂件#include "XDataBase.h"#include <QCoreApplication>#include <QDebug>#include <QSqlRecord>DataBase::DataBase(QString name, QObject *parent): QObject(parent){if (QSqlDatabase::contains(name)) {m_DataBase = QSqlDatabase::database(name);}else {m_DataBase = QSqlDatabase::addDatabase("QSQLITE");m_DataBase.setDatabaseName(QCoreApplication::applicationDirPath()+"/"+ name+".db");}initTable();}DataBase::~DataBase(){}bool DataBase::initTable(){if (!m_DataBase.open()) {return false;}if (!isExistTable("students")) {createTable("students");}return false;}bool DataBase::isExistTable(QString table){bool bRet = false;if (!m_DataBase.open()) {return bRet;}QSqlQuery query(m_DataBase);query.exec(QString("select count(*) from sqlite_master where type='table' and name='%1'").arg(table)); //关键的判断if (query.next()){if (query.value(0).toInt() > 0){bRet = true;}}return false;}bool DataBase::createTable(QString table){if (!m_DataBase.open()) {return false;}QSqlQuery query(m_DataBase);if (table == QString("students")) {bool success = query.exec("CREATE TABLE students (""id INTEGER PRIMARY KEY AUTOINCREMENT, ""name VARCHAR(40) NOT NULL, ""score INTEGER NOT NULL, ""grade VARCHAR(40) NOT NULL)");if (success) {return true; //新建数据库成功}else {QSqlError lastError = stError();QString err = lastError.driverText();return false;}}else {return false;}}bool DataBase::insertData(StudentData data){if (!m_DataBase.open()) {return false;}QSqlQuery query(m_DataBase);bool success = query.exec(QString("INSERT INTO students (name, score,class) ""VALUES (%1, %2, %3)").arg().arg(data.score).arg(data.grade));if (!success) {QSqlError lastError = stError();QString err = lastError.driverText();return false;}return true;}bool DataBase::deleteData(QString name){if (!m_DataBase.open()) {return false;}QSqlQuery query(m_DataBase);query.prepare(QString("DELETE FROM students WHERE name='%1'").arg(name)); query.exec();return false;}bool DataBase::getDataByName(int name, StudentData & data){if (!m_DataBase.open()) {return false;}QSqlQuery query(m_DataBase);query.prepare(QString("SELECT * FROM students WHERE name='%1'").arg(name)); query.exec();QSqlRecord rec = query.record();if (query.next()){ = query.value(0).toString();data.score = query.value(1).toInt();data.grade = query.value(2).toString();return true;}return false;}bool DataBase::getDataList(QList<StudentData>& list){if (!m_DataBase.open()) {return false;}QSqlQuery query(m_DataBase);query.prepare(QString("SELECT * FROM students"));query.exec();QSqlRecord rec = query.record();while (query.next()){StudentData data; = query.value(0).toInt();data.score = query.value(1).toInt();data.grade = query.value(2).toInt();list.append(data);return true;}return false;}bool DataBase::update(){if (!m_DataBase.open()) {return false;}QSqlQuery query(m_DataBase);query.prepare("UPDATE students SET score = 100 , name = '⼩A'");query.exec();return false;}调⽤:XClientApp.h头⽂件#pragma once#include <QApplication>#include <DataBase.h>#include "ServerAPI.h"#define clientApp static_cast<XClientApp*>(QCoreApplication::instance())class XClientApp : public QApplication{Q_OBJECTpublic:XClientApp(int argc, char *argv[]);~XClientApp();DataBase* getDataBase();ServerAPI* getServerAPI();QString getAppName();private:void setFont(QString font);void setStyle();private:DataBase* m_pDataBase;ServerAPI* m_pServerAPI;signals:void sglSystemMessage(QString type, QString data);};XClientApp.cpp源⽂件#include "XClientApp.h"XClientApp::XClientApp(int argc, char *argv[]): QApplication(argc, argv){m_pDataBase = new DataBase("xclient", this);setWindowIcon(QIcon(":/Images/Resources/朱砂古镇.ico"));//可执⾏程序图标 setStyle();m_pServerAPI = new ServerAPI(this); //注意有重载}DataBase * XClientApp::getDataBase() //获取本地数据库并进⾏操作{return m_pDataBase;}。

qt----QSqlDatabase数据库

qt----QSqlDatabase数据库

qt----QSqlDatabase数据库说明 qt有关数据库操作常⽤QSqlDatabase这个类来操作,使⽤这个类时,⾸先在模块中添加 Qt += sql 然后再添加头⽂件 #include <QtSql>常⽤操作 1、创建数据库 2、数据的增、删、改、查1、创建数据库QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setHostName("MyBrandDB");db.setDatabaseName("MyDb.db");db.setUserName("Liu");db.setPassword("123456");if(!db.open())return false;在使⽤QSqlDatabase::addDatabase("QOCI","OracleA")函数时,第⼀个参数是驱动类型主键,第⼆个是连接名。

2、数据库的增删改查(查询命令就是SQL的通⽤命令)创建⼀张表QSqlQuery query;//创建分类表query.exec("create table type_table(id varchar primary key, name varchar)");query.exec("insert into type_table values('0', '请选择类型')");query.exec("insert into type_table values('1', '电视')");query.exec("insert into type_table values('2', '空调')");查询/获取键值QSqlQuert query;query.exec(QString("select price from table_name where 条件1='' and 条件2=''")) query.next();//在执⾏完exec()之后会把指针放在记录集中的第⼀个记录之上,所以需要调⽤next()来获取第⼀个数据int nPrice = query.value(0).toInt();修改/写⼊数据库QSqlQuery query;QSqlDatabase::database().transaction(); //事物操作bool bResult = query.exec(QString("update table_name set price=2 where 条件1='' and 条件2=''"));if(bResult)QSqlDatabase::database().commit(); //提交elseQSqlDatabase::database().rollback(); //回滚。

qt sqlite 例程

qt sqlite 例程

qt sqlite 例程标题:Qt SQLite 例程Qt 是一种跨平台的C++开发框架,广泛应用于图形用户界面(GUI)和嵌入式开发。

SQLite 是一种轻量级的嵌入式数据库引擎,适用于小型应用程序和嵌入式设备。

本文将介绍如何使用 Qt 和 SQLite 来开发一个简单的数据库应用程序的例程。

一、准备工作在开始之前,我们需要先安装 Qt 开发环境,并确保已经安装了 Qt 的 SQLite 插件。

如果尚未安装,可以根据自己的操作系统从 Qt 官方网站下载并安装。

安装完成后,打开 Qt Creator,创建一个新的 Qt Widgets Application 项目。

二、创建数据库在Qt Creator 中创建的项目中,可以看到一个名为mainwindow.cpp 的文件。

打开该文件,在构造函数中添加以下代码,用于创建一个 SQLite 数据库和一个表:```cpp#include <QSqlDatabase>#include <QSqlQuery>QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("example.db");if (db.open()) {QSqlQuery query;query.exec("CREATE TABLE IF NOT EXISTS students (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)");}```以上代码中,我们首先使用 `QSqlDatabase::addDatabase` 函数来添加一个 SQLite 数据库,然后使用 `setDatabaseName` 函数指定数据库的文件名。

接着,我们使用 `open` 函数打开数据库连接,并使用 `QSqlQuery` 对象执行 SQL 语句来创建一个名为 students 的表,其中包含 id、name 和 age 三个字段。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

当然我们一定要记住这个顺序,先创建数据库,然后再去创建一个表(作为菜鸟的我犯这个错误了),还有一点需要注意的红色标记的那句话,我参考的数籍一般都这样写db.setDatabaseName(":memory:");这样就把生成的数据库文件是在内存当中的,在工程文件目录下找不到。

上面使我们创建了一个数据库和一个表,那么我们如何把它呈现在我们的QTableview部件上呢?QSqlTableModel *model = new QSqlTableModel;model->setTable("person");model->setEditStrategy(QSqlTableModel::OnManualSubmit);model->select();ui->tableView->setModel(model);ui->tableView->show();上面的代码就把数据库中的信息不加筛选的打印到控件上了。

第一次写博客大家多多包涵。

Qt中提高sqlite的读写速度SQLite数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度。

例如:向数据库中插入100万条数据,在默认的情况下如果仅仅是执行query.exec("insert into DataBase(......)values(......)");就会打开和关闭文件100万次,所以速度当然会很慢。

SQLite 数据库是支持事务操作的,于是我们就可以通过事务来提高数据库的读写速度。

事务的基本原理是:数据库管理系统首先会把要执行的sql语句存储到内存当中,只有当commit()的时候才一次性全部执行所有内存中的数据库。

下面是一个简单的QT sqlite数据库事务的例子:#include <QtCore/QCoreApplication>#include <QtSql>#include <iostream>using namespace std;int main(int argc, char *argv[]){QCoreApplication a(argc, argv);QSqlDatabase db_sqlite = QSqlDatabase::addDatabase("QSQLITE", "connSQLite");db_sqlite.setDatabaseName("SQLiteDB.db3");db_sqlite.open();QSqlQuery query("", db_sqlite);bool bsuccess = false;QTime tmpTime;// 开始启动事务db_sqlite.transaction();tmpTime.start();for(int i = 0; i<100000; i++){bsuccess = query.exec("insert into DataBase(D_1,D_2,D_3,D_4,D_5) values('TT','TT','TT','TT','TT')");if (!bsuccess){cout<<"Error occur"<<endl;break;}}// 提交事务,这个时候才是真正打开文件执行SQL语句的时候db_mit();cout<<"10000条数据耗时:"<<tmpTime.elapsed()<<"ms"<<endl;}其实QT 操作sqlite数据库增加事务的功能就是上面例子中蓝色字体标出的两句话,如果去掉这两句话,程序又会还原为:打开文件——执行query.exec(...)——关闭文件。

大家可以试一下,添加这两句即增加事务以后数据插入的速度明显提高很多。

在入库和更新过程中按照数据库事务的思想进行设计:SQLite执行入库、更新操作的方式是,sql语句执行对象句柄调用库函数打开文件、调用函数执行sql 语句、关闭文件。

这样的执行方式对于数量级别超大的文件的弊端就是每次执行sql语句的时候都要打开文件(假设百万级数量级的数据,就要打开和关闭文件百万次),对于数据库的入库和更新操作时间主要都浪费到了文件的打开和关闭操作上,所以这里增加事务以解决该问题。

Qt数据库sqlite总结QSqlDatabase类实现了数据库连接的操作QSqlQuery类用来执行SQL语句QSqlRecord类封装数据库所有记录QSqlRelationalTableModelQSqlQueryModelQSqlTableModel第一:QSqlDatabase类QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); 采用QSQLITE数据库db.setHostName("localhost"); //设置数据库主机名db.setDatabaseName("test"); //设置数据库名db.setUserName("root"); //设置数据库登入用户名db.setPassword("123456"); //设计数据库登入密码db.open()打开数据库连接db.close();//释放数据库QStringList drivers = QSqlDatabase::drivers();//静态成员函数,是类的成员函数,不是对象的.返回所有可用的数据库驱动程序的清单drivers.removeAll("QMYSQL3"); //删除列表中的项foreach(QString driver, drivers) //遍历数据库驱动,测试数据库驱动种类qDebug() << “\t” << driver;第二:QSqlQuery类,查询数据库,插入值到数据库等操作数据库QSqlQuery query;query.prepare("INSERT INTO T_USER (name, age) VALUES (:name, :age)"); query.bin dValue(":name", "justin"); //在这定占位符上确定绑定的值query.bindValue(":age", 33);query.exec();QSqlQuery query; //以下执行相关SQL语句query.exec(“create table student(id int primary key,name varchar)”)//新建student表,id设置为主键,还有一个name项query.exec(“insert into student values(1,’xiaogang’)”);query.exec(“insert into student values(2,’xiaoming’)”);query.exec(“insert into student values(3,’xiaohong’)”);//向表中插入3条记录query.exec(“select * from student”);来查询出表中所有的内容。

其中的SQL语句“select * from student”中“*”号表明查询表中记录的所有属性。

而当query.exec(“select * from student”);这条语句执行完后,我们便获得了相应的执行结果,因为获得的结果可能不止一条记录,所以我们称之为结果集。

seek(int n) :query指向结果集的第n条记录。

指定当前的位置first() :query指向结果集的第一条记录。

last() :query指向结果集的最后一条记录。

next() :query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录。

previous() :query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录。

record() :获得现在指向的记录。

value(int n) :获得属性的值。

其中n表示你查询的第n个属性,比方上面我们使用“select * from student”就相当于“select id, name from student”,那么value(0)返回id属性的值,value(1)返回name属性的值。

该函数返回QVariant类型的数据,关于该类型与其他类型的对应关系,可以在帮助中查看QVariant。

at()//返回当前查询的位置QString name = query.value(0).toString(); //返回"name"字段的索引值"justin",value(i)返回i字段的值,0表示name,1表示ageint rowNum = query.at();//获取query所指向的记录在结果集中的编号int columnNum = query.record().count();//获取每条记录中属性(即列)的个数int fieldNo = query.record().indexOf(“name”);//获取”name”属性所在列的编号,列从左向右编号,最左边的编号为0int id = query.value(0).toInt();//获取id属性的值,并转换为int型QString name = query.value(fieldNo).toString();//获取name属性的值qDebug() << “rowNum is : ” << rowNum //将结果输出<< ” id is : ” << id<< ” name is : ” << name<< ” columnNum is : ” << columnNum;if(query.seek(2)) //seek指定当前的位置if(query.seek(ui->spinBox->value())){qDebug() << query.value(0).toInt() << query.value(1).toString();while(query.next()) //每执行一次该函数,便指向相邻的下一条记录。

相关文档
最新文档