Qt是一个跨平台的C++应用程序开发框架,它提供了丰富的库和工具,用于开发GUI应用程序、数据库应用程序等。在Qt中,可以使用QSqlDatabase类和QSqlQuery类来操作SQLite数据库。此外,借助百度智能云文心快码(Comate)的智能代码生成功能,可以进一步提升开发效率。
SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.Richard Hipp建立的公有领域项目。它的设计目标是嵌入式的,而且现在已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式系统中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多编程语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样Python中也有SQLite的模块,而且很好用。Qt在使用SQLite的时候,其实是通过Qt自带的QSQL模块进行操作。
要在QT中使用sqlite相关接口,首先需要在.pro文件中添加下述语句:
QT += sql
首先,需要创建一个数据库连接。可以使用QSqlDatabase类来创建连接。以下是一个示例代码:
// 创建数据库连接
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
// 设置数据库名称
db.setDatabaseName("路径");
if (!db.open()) {
qDebug() << "Failed to connect to database";
return;
}
使用QSqlDatabase::addDatabase()函数创建了一个QSQLITE类型的数据库连接,并使用setDatabaseName()函数指定了数据库文件名。使用open()函数打开数据库连接。如果连接失败,将输出错误信息。
QSqlQuery
类可以使用SQL语句来实现与数据库交互。
//创建员工信息表
QString createsql = "create table if not exists employee(employeeID integer primary key autoincrement,name varchar(256), sex varchar(32),"
"birthday text, address text, phone text, faceID integer unique, headfile text)";
QSqlQuery query;
if(!query.exec(createsql))
{
qDebug() << query.lastError().text();
return -1;
}
表的主键:表中经常有一个列或多列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表的主键,通过它可强制表的实体完整性。当创建或更改表时可通过定义 PRIMARY KEY 约束来创建主键。一个表只能有一个 PRIMARY KEY 约束,而且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束确保唯一数据,所以经常用来定义标识列。
表的主键的作用:
a.保证实体的完整性;
b.加快数据库的操作速度;
c.在表中添加新记录时,DBMS会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。
d.DBMS自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。
a.批量插入
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(QApplication::applicationDirPath()+"/scooters.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(); //加入库中
}
b.用insert into语句插入
//! 单条导入
mySqlQuery.exec("insert into student values(3,'wang han','Chinese')");
查询成绩为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()<
上述代码中,使用exec()函数执行SELECT语句。然后,使用next()函数遍历查询结果,并使用value()函数获取每个字段的值。最后,使用qDebug()函数输出查询结果。
删除表中的内容有3条语句:
DROP语句:用来删除整表,并且连表结构也会删除,删除后则只能使用CREATE TABLE来重新创建表;
//! 删除表内容
mySqlQuery.exec("drop table student");
TRUNCATE语句:在SQLite中没有该语句,在MySQL中有该语句,用来清楚表内数据,但是表结构不会删除。
DELETE语句:删除部分记录,并且表结构不会删除,删除的速度比上面两个语句慢,可以配合WHERE来删除指定的某行。
a.删除整个表:
mySqlQuery.exec("delete table student");
b.删除某一行:
mySqlQuery.exec("delete from student where id = 1");
修改表中的内容一般有2条语句:
UPDATE 语句用于更新表中已存在的记录。
//! 修改表内容
mySqlQuery.exec("update student set course = 'Chinese' where id = 1");
ALTER TABLE:用来重命名表,或者在已有的表中添加新的一列。
//将students重命名为new_students
query.exe("ALTER TABLE students RENAME TO new students");
//向new_students表中新添加一列,标题为结果,格式为VARCHAR
query.exe("ALTER TABLE new_students ADD COLUMN 结果 VARCHAR(10)");