42.QT-QSqlQuery类操作SQLite数据库(创建、查询、删除、修改)详解

Qt 提供了 QtSql 模块来提供平台独立的基于 SQL 的数据库操作。这里我们所说的“平台
独立”,既包括操作系统平台,也包括各个数据库平台,Qt支持以下几种数据库:

  • QT自带SQLITE数据库,不需要再安装
  • QTDS在Qt4.7起已经被移除

1.QtSql

要使用QtSql 模块的话,需要在.pro文件中添加这么一句:

QT += sql 

2.QSqlDatabase

QSqlDatabase类提供了一个接口,用于通过连接访问数据。QSqlDatabase的一个实例表示连接。该连接通过受支持的数据库驱动程序之一提供对数据库的访问,该驱动程序派生自QSqlDriver。

2.1 创建一个数据库示例如下

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("scooters.dat");     //如果本目录下没有该文件,则会在本目录下生成,否则连接该文件
 if (!db.open()) {
        QMessageBox::warning(0, QObject::tr("Database Error"),
                             db.lastError().text());
        return false;
 }

编译运行后,可以看到已经创建了该文件:

创建成功后,该文件默认为空的,然后就可以使用QSqlQuery类来操作该数据库, QSqlQuery类使用的是SQL语句,如果只需要使用高层次的数据
库接口(不关心 SQL 语法),我们可以选择 QSqlTableModel 和
QSqlRelationalTableModel(在后续章节介绍)。本章我们介绍
QSqlQuery 类,来如何使用SQL语法.

3.QSqlQuery类介绍

通过exec()成员函数来执行DML(数据操作语言)语句,如SELECT、INSERT、UPDATE和DELETE,以及DDL(数据定义语言)语句等.

比如:

QSqlQuery query;
query.exec("DROP TABLE students");    //删除名为students的表

4.接下来,我们讲讲如何导入数据

创建表:

query.exec("CREATE TABLE students ("
                   "id INTEGER PRIMARY KEY AUTOINCREMENT, "
                   "name VARCHAR(40) NOT NULL, "
                   " score INTEGER NOT NULL, "
                   "class VARCHAR(40) NOT NULL)");
                //创建一个students表,标题分别为id、name、score、class

" PRIMARY KEY AUTOINCREMENT,":表示该列为整数递增,如果为空时则自动填入1,然后在下面的每一行都会自动+1, PRIMARY KEY则表示该列作为列表的主键,通过它可以轻易地获取某一行数据

" INTEGER ":表示该列为带符号的整数

" VARCHAR(40) ":表示该列为可变长字符串,默认只能存储英文和数字或者utf-8,最多存储40个字节.

"NOT NULL ":表示该列的内容不为空

导入数据:

query.exec("INSERT INTO students (name, score,class) "
               "VALUES (‘小张‘, 85, ‘初2-1班‘)");
              //向students表里的(name, score,class)标题下插入一项数据‘小张‘, 85, ‘初2-1班‘

添加后如下图所示:

5.批量导入库

如果我们有大串数据需要导入时,也可以使用prepare()来绑值,然后再通过bindValue()向绑值加入数据

示例代码如下所示:

QStringList names;
names<<"小A"<<"小B"<<"小C"<<"小D"<<"小E"<<"小F"<<"小G"
           <<"小H"<<"小I"<<"小G"<<"小K"<<"小L"<<"小M"<<"小N";

QStringList clases;
clases<<"初1-1班"<<"初1-2班"<<"初1-3班"<<"初2-1班"
         <<"初2-2班"<<"初2-3班"<<"初3-1班"<<"初3-2班"<<"初3-3班";

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("students.dat");     //在本目录下生成
QSqlQuery query;
query.exec("DROP TABLE students");        //先清空一下表
query.exec("CREATE TABLE students ("
                   "id INTEGER PRIMARY KEY AUTOINCREMENT, "
                   "name VARCHAR(40) NOT NULL, "
                   " score INTEGER NOT NULL, "
                   "class VARCHAR(40) NOT NULL)");
                //创建一个students表

    query.prepare("INSERT INTO students (name, score,class) "
                  "VALUES (:name, :score, :class)");
                    //为每一列标题添加绑定值

    foreach (QString name, names)       //从names表里获取每个名字
    {
        query.bindValue(":name", name);                      //向绑定值里加入名字
        query.bindValue(":score", (qrand() % 101));      //成绩
        query.bindValue(":class", clases[qrand()%clases.length()] );    //班级
        query.exec();               //加入库中
     }

运行后,通过SQLite工具打开students.dat,如下图所示:

6.查询表内容

我们对上图生成的students.dat文件进行查询内容时,则需要使用WHERE 关键字实现.

示例-查询成绩值为60~80之间的学生:

    query.exec("SELECT * FROM students WHERE score >= 60 AND score <= 80;");
    while(query.next())
    {
        QString id = query.value(0).toString();
        QString name = query.value(1).toString();
        QString score = query.value(2).toString();
        QString classs = query.value(3).toString();

        qDebug()<<id<<name<<score<<classs;
    }

运行打印:

当然还有其它语句,比如:

"SELECT * FROM students WHERE score >= 80 OR class == ‘初3-3班‘;"
       //判断成绩大于等于80,或者班级为初3-3班的

打印如下图所示:

 "SELECT * FROM students WHERE class GLOB ‘*3-3*‘;"
            // GLOB表示通配符,匹配班级带有"3-3"的名字

打印如下图所示:

7.删表内容

删表内容有3个语句:

  • DROP:          用来删除整表,并且连表结构也会删除,删除后则只能使用CREATE TABLE来重新创建表
  • TRUNCATE:   在SQLite中没有该语句,在MySQL中有该语句,用来清楚表内数据,但是表结构不会删除.
  • DELETE:      删除部分记录,并且表结构不会删除,删除的速度比上面两个语句慢,可以配合WHERE来删除指定的某行

示例1

query.exec("DELETE FROM students");           //删除students表里所有内容

删除后如下图所示:

示例2-删除id=3的一行

query.exec("DELETE FROM students WHERE  id = 3");

删除前:

删除后:

8.改表内容

改表内容一般用下面两个语句:

  • UPDATE :      用来修改表中内容,可以通过WHERE语句来指定修改
  • ALTER  TABLE:  用来重命名表,或者在已有的表中添加新的一列

8.1 ALTER 示例

示例1

query.exec("ALTER TABLE students RENAME TO new_students");      //将students重命名为new_students

运行后如下图所示:

 示例2

query.exec("ALTER TABLE  new_students ADD COLUMN 结果 VARCHAR(10)");
//向 new_students表里添加新的一列,标题为结果,内容格式为VARCHAR

运行后如下图所示:

8.2 UPDATE 示例

示例1-不使用WHERE,直接修改某列

query.exec("UPDATE  new_students  SET score = 100 , name = ‘小A‘");
                  //修改score和name所在的列内容

修改后如下图所示:

示例2-使用WHERE,判断小于60的设为不合格,否则设为合格

query.exec("UPDATE  new_students  SET 结果=‘不合格‘  WHERE  score<60 ");
query.exec("UPDATE  new_students  SET 结果=‘合格‘  WHERE  score>=60 ");

修改前如下图所示:

修改后:

原文地址:https://www.cnblogs.com/lifexy/p/10921958.html

时间: 2024-10-10 06:08:28

42.QT-QSqlQuery类操作SQLite数据库(创建、查询、删除、修改)详解的相关文章

Sqlite数据库创建、删除、降级笔记

(1).在创建sqlite数据库时需要注意oncreate()方法只有在第一次创建数据库时候运行.当数据库删除后也会执行,sqlite不支持数据库删除,但可以删除相应的文件,即删了数据库.当我们再次配置文件时候就会执行oncreate()了. (2).onUpgrade()只有在版本号发生改变(增加)时候才会执行,很多时候我们直接在onUpgrade()里添加我们想插入的表或者列,但会报错,那是因为你之前版本onUpgrade里的语句会再次执行,若之前插入了表.或者行,此时会再执行一次,因此每次

Qt操作Sqlite数据库

总算在Qt中把Sqlite操作成功了,写点总结吧.其实早就弄对了的,但查看数据库就是没有想要的结果.最后发现生成的执行文件在Dbug目录,与先前设定的路径不同,这才恍然大悟. 一.使用到数据库模块,需在pro文件中加入:QT += sql 二.所需数据库操作的相关头文件:#include <QSqlDatabase>#include <QSqlQuery>#include <QSqlRecord>#include <QSqlField> 三.连接Sqlite

无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.demo1" /> 上面targetPackage指定的包要和应用的package相同. (2)在清单文件中ap

JDBC访问及操作SQLite数据库

SQLite 是一个开源的嵌入式关系数据库,其特点是高度便携.使用方便.结构紧凑.高效.可靠. 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下,只要确保SQLite的二进制文件存在即可开始创建.连接和使用数据库.  SQLite的下载页面:http://www.sqlite.org/download.html window操作系统下载:sqlite-dll-win32-x86-3081002.zip及sqlite-shell-win32-x86-3081002.zi

android操作sqlite数据库及心得

写这篇文章主要是网上的对sqlite的操作太多且太杂,很多时候都不能很好的运用到自己的项目中,结构不清晰,我自己写了一篇适合刚刚接触的人看的操作方法. 近来用android时要将一些数据保存起来,一开始用的是preferences,后来要保存的东西多了,发现用preferences明显不能满足要求了,而且发现用这个的话代码就变得有点乱了,所以才开始学习使用sqlite数据库,一开始以为不就是个数据库么,和平时的mysql啊或者是sqlserver都一样,都很简单的,但后来真正在用的时候才发现困难

Android——使用SQLiteDatabase操作SQLite数据库

除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n).char(n).decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型. SQLite最大的特点是

微信PK10平台开发Go实战--go语言操作sqlite数据库

生命不止,继续 go go go !!!微信PK10平台开发 继续与大家分享,go语言的实战,今天介绍的是如何操作sqlite数据库. 何为sqlite3? SQLite is a self-contained, high-reliability, embedded, full-featured, public-domain, SQL database engine. 最主要的是,sqlite是一款轻型的数据库 database/sql包 go中有一个database/sql package,我

Java操作Sqlite数据库

Java操作Sqlite数据库步骤: 1. 导入Sqlite jdbc 本文使用sqlite-jdbc-3.7.2.jar,下载地址 http://pan.baidu.com/s/1kVHAGdD 2. 编写jdbc连接代码 public class OpSqliteDB { private static final String Class_Name = "org.sqlite.JDBC"; private static final String CallMarkDB_URL = &

赵雅智_使用SQLiteDatabase操作SQLite数据库及事务

知识点详解:http://blog.csdn.net/zhaoyazhi2129/article/details/9025995 具体代码: MainActivity.java package com.example.android_sqlite; import android.app.Activity; import android.os.Bundle; import com.example.android_sqlite.dao.impl.UserDaoImpls; import com.ex