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

版权声明:欢迎转载和收藏。转载请注明出处,谢谢! https://blog.csdn.net/u014266675/article/details/78321192

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.cpp

bool 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.cpp

bool 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.cpp

bool 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(“中文”)

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

这里写图片描述

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u014266675/article/details/78321192
今日推荐