【Qt】SQLite数据库

SQLite简介

        SQLite是一种嵌入式关系型数据库管理系统,它是一个软件库,提供了一个自包含、无服务器、零配置的、事务性的SQL数据库引擎。与传统的数据库管理系统不同,SQLite不需要独立的服务器进程,不需要在系统中配置。

        SQLite具有轻量级、高度可靠、易于使用的特点。它广泛应用于移动设备、嵌入式系统和小型应用程序中,但也可以在更大规模的应用中使用。

        SQLite可以跨平台运行(Linux、Mac OS-X、Android、IOS、Windows)。

        Qt的SQL模块中提供了一套统一的操作数据库的API,可以与多种数据库进行交互,其中就包括SQLite。只需要提供SQLite数据库文件,就可以使用Qt的数据库接口进行连接和操作。

        SQLite数据库文件的一般后缀名是 .sqlite.db.db3。这只是一般情况,其实,SQLite数据库文件的后缀名并不是强制的,可以根据喜好任意添加后缀名。

        SQLite数据库文件实际上是二进制文件,而不仅仅包含数据的简单文本文件。所以,使用文本编辑器打开和修改SQLite数据库文件是行不通的。

        在Qt环境中使用SQLite,不用安装。Qt sql 模块中包含。

关系模型概念

         属性名也叫作字段,每一行就是一条记录也叫作一个元组,每个单元格就是一个分量。

各种键的含义

        在关系型数据库中,有几种常见的键(Key)概念,下面是对它们的解释:

主键(Primary Key)主键是唯一标识数据库表中每一条记录的字段或字段组合。主键的值必须是唯一且不能为空,用于保证数据的完整性和唯一性。
外键(Foreign Key)外键是一个表中的字段,它与另一个表中的主键相关联,用于建立表与表之间的关联信息。外键在一个表中用于引用另一个表中的数据,用于实现数据之间的关联和完整性约束。
候选键(Candidate Key)候选键是可以作为主键的字段或字段组合。一个表可能有多个候选键,但只能选择一个作为主键。候选键的值在表中必须唯一,但可以为空。
超键(Super Key)能够唯一标识关系模式中的所有元组的属性集合。换句话说,超键是包含一条或多条属性的集合,这些属性的组合可以唯一地区分关系模式中的不同记录。
主属性(Primary Attribute)主属性是指关系模式中用来唯一标识每个记录的属性。主属性的值在整个表中必须是唯一的,用于保证数据的完整性和唯一性。通常情况下,主属性会被选择为主键。
非主属性(Non-Primary Attribute)非主属性是指除了主属性之外的其他属性,非主属性不用于唯一标识记录,但包含了记录的其他相关信息。非主属性的值可以重复,可以为空,不具备唯一性约束。

        假如有两张数据库表如图:     

 

        学生表中,我们假设:只有学号和身份证号是唯一的,姓名、性别、学院编号、专业编号、出生日期、籍贯,它们之间任意组合都不唯一。

超键

        由超键的含义可知,学生表中含有学号或身份证号的任意组合都为此表的超键。如:

  • 学号
  • 身份证号
  • 学号+姓名
  • 学号+性别
  • 学号+姓名+性别+出生日期
  • 身份证号+籍贯
  • 等等

        可以计算出共有3*(C(6,0) + C(6,1) + C(6,2) + C(6,3) + C(6,4) + C(6,5) + C(6,6))=192个超键。

候选键

        候选键属于超键,它是最小的超键,就是说如果再去掉候选键中的任意一个属性它就不再是超键了,也就是说其中没有一个冗余的键。

        因为我们之前的假设,姓名、性别、学院编号、专业编号、出生日期、籍贯,它们之间任意组合都不唯一。因此,学生表中的候选键为学号和身份证号

        如果我们取消掉之前的假设:也许会有更多的候选键,如:专业编号+出生日期(相当于说同一个专业没有同一天出生的学生,此时去掉任意一个条件,都不能确定唯一性,只有两个条件在一起,才有唯一性)等。

        可以得知:候选键是超键的子集,超键是候选键的超集。

主键

        主键就是候选键里面的一个,是人为规定的。

        因为主键是从候选键中人为选取的一个,而候选键并不一定都是单独的键,因此主键并不一定是单个属性,也可能是组合键。不过,通常都是单个属性做主键。

        例如:学生表中我们用学号做主键,学院表中我们用学院编号做主键。

        可以得知:主键是是候选键的子集,候选键是主键的超集。

外键

        外键比较简单,外键就是自己表中的其他表的主键。

        例如:在我们将学院表中的学院编号作为学院表的主键的前提下,那么在学生表中的学院编号就是学生表中的外键。也许学生表中的专业编号是专业表的主键,那么学生表中的专业编号也是学生表中的外键。同样的,如果学院表中的院长编号是院长表的主键,那么学院表中的院长编号就是学院表的外键

        一张表中可以有零个或多个外键。

主属性

        包含在任一候选码中的属性称主属性。简单来说,主属性是候选码所有属性的并集。

非主属性

        属性中非主属性的属性都是非主属性。有非黑即白那味儿。

关系图

SQLite语法 

        SQLite遵循一套规则称为语法。

大小写敏感性

        SQLite是不区分大小写的,但是也有一些命令是大小写敏感的,比如GLOB和glob在SQLite的语句中有不同含义。

注释

        SQLite注释是附加的注释,可以在SQLite代码中添加注释以增加其可读性。

        两个连续的 “-” 字符(ASCII 0x2d)开始,并扩展到下一个换行符(ASCII 0x0a)或者直到输入结束。

        也可使用C风格的注释,以 “/*” 开始,以 “*/” 结束,可以跨越多行。

-- 这是注释

/*
这也是注释
嗯,也是注释。
*/

数据类型 

NULL表示空值。
INTEGER表示整数,可以是正数、负数或零。
REAL表示浮点数,即带小数部分的数字。
TEXT(VARCHAR)表示文本,以UTF-8或UTF-16编码存储。
BLOB表示二进制数据,可以存储任意类型的数据,例如图像或声音文件。
DATE表示日期,以YYYY-MM-DD格式存储。
TIME表示时间,以HH:MM:SS格式存储。
DATETIME表示日期和时间,以YYYY-MM-DD HH:MM:SS格式存储。
TIMESTAMP表示时间戳,以自UTC纪元(1970-01-01 00:00:00)开始的秒数存储。
BOOLEAN表示布尔类型,可以是true或false。

注意:每一句SQLite语句结尾都要有 ; (分号)。

Qt 中 SQLite 使用

        直接介绍Qt中SQLite的使用。

需要在Qt项目文件中加入: qt += sql

操作SQLite数据库时源代码中必须包含的头文件 :#include <QtSql> 

创建数据库 

QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE", "myDatabase");
database.setDatabaseName("path/to/database/file.db");
if (database.open()) {
    // 连接成功,可以执行数据库操作
    database.close() //不需要连接时可以关闭连接
} else {
    // 连接失败,可以处理错误逻辑
}

建表

        SQL语句:

CREATE TABLE "main"."Student" (
  "ID" TEXT NOT NULL,
  "Name" TEXT NOT NULL,
  "Gender" BOOLEAN NOT NULL,
  "CollegeID" TEXT NOT NULL,
  "MajorID" TEXT NOT NULL,
  "Birthday" DATE NOT NULL,
  "Birthplace" TEXT NOT NULL,
  "IDNumber" TEXT NOT NULL,
  PRIMARY KEY ("ID"),
  FOREIGN KEY ("CollegeID") REFERENCE "main"."College"("ID")
);

CREATE TABLE "main"."College" (
  "ID" TEXT NOT NULL,
  "Name" TEXT NOT NULL,
  "DeanID" TEXT NOT NULL,
  "BulidDay" DATE NOT NULL,
  PRIMARY KEY ("ID"),
);

         代码:

QSqlQuery query(db);
    query.prepare("CREATE TABLE IF NOT EXISTS \"main\".\"Student\" ("
                  "\"ID\" TEXT NOT NULL,"
                  "\"Name\" TEXT NOT NULL,"
                  "\"Gender\" BOOLEAN NOT NULL,"
                  "\"CollegeID\" TEXT NOT NULL,"
                  "\"MajorID\" TEXT NOT NULL,"
                  "\"Birthday\" DATE NOT NULL,"
                  "\"Birthplace\" TEXT NOT NULL,"
                  "\"IDNumber\" TEXT NOT NULL,"
                  "PRIMARY KEY (\"ID\"),"
                  "FOREIGN KEY (\"CollegeID\") REFERENCES \"College\"(\"ID\")"
                  ");");
    if(!query.exec()){
        qDebug()<<"建表失败1:"<<query.lastError();
        return;
    }

    query.prepare("CREATE TABLE IF NOT EXISTS \"main\".\"College\" ("
                  "\"ID\" TEXT NOT NULL,"
                  "\"Name\" TEXT NOT NULL,"
                  "\"DeanID\" TEXT NOT NULL,"
                  "\"BulidDay\" DATE NOT NULL,"
                  "PRIMARY KEY (\"ID\")"
                  ");");
    if(!query.exec()){
        qDebug()<<"建表失败2:"<<query.lastError();
        return;
    }

插入

        SQL语句:

INSERT INTO "main"."College" 
("ID", "Name", "DeanID", "BulidDay") 
VALUES 
('XY01', '挖掘机学院', 'YZ0001', '2069-25-36');


INSERT INTO "main"."Student" 
("ID", "Name", "Gender", "CollegeID", "MajorID", "Birthday", "Birthplace", "IDNumber") 
VALUES 
('XH00001', '陈大', '1', 'XY01', 'ZY001', '2035.13.36', '南天门', '1000000000000000')

        代码:

    query.prepare("INSERT INTO \"main\".\"College\" "
                "(\"ID\", \"Name\", \"DeanID\", \"BulidDay\") "
                "VALUES "
                "('XY01', '挖掘机学院', 'YZ0001', '2069-25-36');");
    if(!query.exec()){
        qDebug()<<"插入数据失败1:"<<query.lastError();
        return;
    }

    query.prepare("INSERT INTO \"main\".\"Student\""
                "(\"ID\", \"Name\", \"Gender\", \"CollegeID\", \"MajorID\", \"Birthday\", \"Birthplace\", \"IDNumber\") "
                "VALUES "
                "('XH00001', '陈大', '1', 'XY01', 'ZY001', '2035.13.36', '南天门', '1000000000000000')");
    if(!query.exec()){
        qDebug()<<"插入数据失败2:"<<query.lastError();
        return;
    }

查询

SELECT * FROM "main"."Student" WHERE "ID" LIKE '%XH00001%';

修改

UPDATE "main"."Student" SET "Birthplace" = '那美克星球' WHERE "ID" = 'XH00001';

        总而言之,就是将SQL语句拿到Qt中执行就行了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值