Qt学习17——初识数据库SQLite(上)

来源:互联网 发布:java培训多少钱 编辑:程序博客网 时间:2024/06/06 06:47

SQLite的使用

摘要:主要是了解Qt中创建SQLite数据库的基本流程,使用QSqlQuery类和SQL基本语法实现创建简单数据库并添加数据。下一篇会介绍与Model/View配合更默契的QSqlTableModel和QSqlRelationalTableModel,这些高层接口将不依赖SQL语法实现数据库操作。

一、创建数据库

新建Qt工程,添加空的C++类文件(本文暂不使用ui)。在.pro文件中添加

QT += sql

这里默认创建的是SQLite,Qt默认搭载QSqlite驱动(包含了Sqlite数据库),所以这里不必使用

QSqlDatabase::drivers()

去查找系统中可用数据库驱动了。
新建方法bool ConnectDB(const QString &dbName),用于创建并配置一个数据库连接。

@sqliteconnection.cppbool SqlConnection::ConnectDB(const QString &dbName) {    QSqlDatabase myDB = QSqlDatabase::addDatabase("QSQLITE");//    myDB.setHostName("host");//    myDB.setDatabaseName("dbname");//    myDB.setUserName("username");//    myDB.setPassword("password");    myDB.setDatabaseName(dbName);    if (!myDB.open()) {        QMessageBox::critical(0,QObject::tr("Database Error"),myDB.lastError().text());        qDebug()<<"my_db open error !";        return false;    }    return true;}

setDatabaseName()用于设置要连接的数据库名,同名链接新的会覆盖旧的。如果搭建数据库服务器,注释中可以对主机名、用户名等进行配置。open()用于打开数据库链接并返回bool值。lastError()用于输出最新错误。在main()中调用它:

@main.cpp#include "mainwindow.h"#include "sqlconnection.h"#include <QApplication>#include <QFile>int main(int argc, char *argv[]){    QApplication a(argc, argv);    QFile file("demo.db");    if (file.exists())        file.remove();//用于测试时删除上一次创建的数据库    SqlConnection sql;    sql.ConnectDB("demo.db")//建立名为"demo.db"的数据库连接//    MainWindow w;//    w.show();    return a.exec();}

此时已经可以创建一个数据库链接,在build-debug文件路径下可以看到demo.db文件。

二、添加数据库查询

要实现数据库查询,需要将QSqlQuery实例化。

@sqlconnection.cppbool SqlConnection::CreateDB() {    QSqlQuery query;    if (!query.exec("CREATE TABLE music ("                    "id INTEGER PRIMARY KEY AUTOINCREMENT,"                    "title VARCHAR,"                    "artist VARCHAR)"))    {        QMessageBox::critical(0,QObject::tr("Database Error"),query.lastError().text());        return 1;    }    return true;}

这里创建了一个数据库表music,包含titleartist两个属性,关键字”id”自动递增。

三、插入数据

@sqlconnection.cppbool SqlConnection::AddData() {        QSqlQuery query;        query.prepare("INSERT INTO music (title, artist) VALUES (?,?)");        QStringList titles;        titles <<QString::fromLocal8Bit("小城故事")<< QString::fromLocal8Bit("她") << "Dapartures";        query.addBindValue(titles);        QVariantList artists;        artists<< QString::fromLocal8Bit("邓丽君") << QString::fromLocal8Bit("朱婧汐") << "EGOIST";        query.addBindValue(artists);        if (!query.execBatch()) {            QMessageBox::critical(0,QObject::tr("Database Error"),query.lastError().text());        }        query.finish();        query.exec("SELECT title, artist FROM music");        while (query.next()) {            QString title = query.value(0).toByteArray();            QString artist = query.value(1).toByteArray();            qDebug()<<title<<"|"<<artist;        }        return true;}
@main.cpp#include "mainwindow.h"#include "sqlconnection.h"#include <QApplication>#include <QFile>int main(int argc, char *argv[]){    QApplication a(argc, argv);    QFile file("demo.db");    if (file.exists())        file.remove();    SqlConnection sql;    if (sql.ConnectDB("demo.db")) {            sql.CreateDB();            sql.AddData();    }//    MainWindow w;//    w.show();    return a.exec();}

运行结果:
运行结果

三、中文问题

Sqlite默认是不支持中文的(截止目前版本为SQLite version 3.20.1),网上看了一圈方法很多,但是有的写的也很复杂。我这里给出一种能简便地实现中文输入的方法:

1、将包含中文的文件(.cpp、.h)用记事本打开,随便加个空格什么的修改一下,保存。
2、在使用中文的地方用QString::fromLocal8Bit(“中文”)

就可以实现将中文字符插入数据库了。

这里写图片描述

这里写图片描述

原创粉丝点击