QT 创建本地数据库(SQLite数据库)存储数据

Posted 远方是什么样子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT 创建本地数据库(SQLite数据库)存储数据相关的知识,希望对你有一定的参考价值。

 

注意:QT自带SQLITE数据库,不需要再安装

 

1.创建一个包含创建、查询、修改和删除数据库的数据库类(DataBase)

DataBase.h头文件

#pragma once

#include <QObject>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlDriver>
#include <QtSql/QSqlError>
#include "client_global.h"

struct StudentData
{
  QString name;
  int score;
  QString grade;
}; class DataBase : public QObject { Q_OBJECT public: DataBase(QString name,QObject *parent=0); ~DataBase();
public:
bool insertData(StudentData data); bool deleteData(int name); bool getDataByName(int name, StudentData & data); bool getDataList(QList<StudentData> & list);
   bool update();
private: QSqlDatabase m_DataBase; private: bool initTable(); bool isExistTable(QString table); bool createTable(QString table); };

 

DataBase.cpp源文件

#include "XDataBase.h"
#include <QCoreApplication>
#include <QDebug>
#include <QSqlRecord>


DataBase::DataBase(QString name, QObject *parent)
    : QObject(parent)
{
    
    if (QSqlDatabase::contains(name)) {

        m_DataBase = QSqlDatabase::database(name);
    }
    else {

        m_DataBase = QSqlDatabase::addDatabase("QSQLITE");
        m_DataBase.setDatabaseName(name+".db");
        m_DataBase.setDatabaseName(QCoreApplication::applicationDirPath()+"//"+ name);
    }
    initTable();
}

DataBase::~DataBase()
{
}

bool DataBase::initTable()
{
    if (!m_DataBase.open()) {
        return false;
    }

    if (!isExistTable("students")) {
        createTable("students");
    }
    return false;
}

bool DataBase::isExistTable(QString table)
{
    bool bRet = false;
    if (!m_DataBase.open()) {
        return bRet;
    }
    QSqlQuery query(m_DataBase);
    query.exec(QString("select count(*) from sqlite_master where type=‘table‘ and name=‘%1‘").arg(table));    //关键的判断      
    if (query.next())
    {
        if (query.value(0).toInt() > 0)
        {
            bRet = true;
        }
    }
    return false;
}

bool DataBase::createTable(QString table)
{
    if (!m_DataBase.open()) {
        return false;
    }

    QSqlQuery query(m_DataBase);
    if (table == QString("students")) {

        bool success = query.exec("CREATE TABLE students ("
                                    "id INTEGER PRIMARY KEY AUTOINCREMENT, "
                                    "name VARCHAR(40) NOT NULL, "
                                    "score INTEGER NOT NULL, "
                                    "grade VARCHAR(40) NOT NULL)");

        if (success) {
            return true;   //新建数据库成功
        }
        else {
            QSqlError lastError = query.lastError();
            QString err = lastError.driverText();
            return false;
        }
    }
    else {
        return false;
    }
}

bool DataBase::insertData(StudentData data)
{
    if (!m_DataBase.open()) {
        return false;
    }
    QSqlQuery query(m_DataBase);

    bool success = query.exec(QString("INSERT INTO students (name, score,class) "
        "VALUES (%1, %2, %3)").arg(data.name)
                              .arg(data.score)
                              .arg(data.grade));
        
    if (!success) {

        QSqlError lastError = query.lastError();
        QString err = lastError.driverText();
        return false;
    }
    return true;
}

bool DataBase::deleteData(QString name)
{
    if (!m_DataBase.open()) {
        return false;
    }
    QSqlQuery query(m_DataBase);
    query.prepare(QString("DELETE FROM students WHERE name=‘%1‘").arg(name));
    query.exec();
    return false;
}

bool DataBase::getDataByName(int name, StudentData & data)
{
    if (!m_DataBase.open()) {
        return false;
    }
QSqlQuery query(m_DataBase); query.prepare(QString(
"SELECT * FROM students WHERE name=‘%1‘").arg(name)); query.exec(); QSqlRecord rec = query.record(); if (query.next()) { data.name = query.value(0).toString(); data.score = query.value(1).toInt(); data.grade = query.value(2).toString(); return true; } return false; } bool DataBase::getDataList(QList<StudentData>& list) { if (!m_DataBase.open()) { return false; } QSqlQuery query(m_DataBase); query.prepare(QString("SELECT * FROM students")); query.exec(); QSqlRecord rec = query.record(); while (query.next()) { StudentData data; device.name = query.value(0).toInt(); device.score = query.value(1).toString(); device.grade = query.value(2).toInt(); list.append(data); return true; } return false; } bool DataBase::update() { if (!m_DataBase.open()) { return false; } QSqlQuery query(m_DataBase); query.prepare("UPDATE students SET score = 100 , name = ‘小A‘"); query.exec(); return false; }

 

 

 

调用:

XClientApp.h头文件

#pragma once

#include <QApplication>
#include <DataBase.h>
#include "ServerAPI.h"
#define clientApp static_cast<XClientApp*>(QCoreApplication::instance())

class XClientApp : public QApplication
{
    Q_OBJECT

public:
    XClientApp(int argc, char *argv[]);
    ~XClientApp();
    DataBase* getDataBase();
    ServerAPI* getServerAPI();
    QString getAppName();
private:
    void setFont(QString font);
    void setStyle();
private:
    DataBase* m_pDataBase;
    ServerAPI* m_pServerAPI;
signals:
    void sglSystemMessage(QString type, QString data);
};

 

 

XClientApp.cpp源文件

 

#include "XClientApp.h"

XClientApp::XClientApp(int argc, char *argv[])
    : QApplication(argc, argv)
{
    
     m_pDataBase = new DataBase("xclient", this);
     setWindowIcon(QIcon(":/Images/Resources/朱砂古镇.ico"));//可执行程序图标
     setStyle();
     m_pServerAPI = new ServerAPI(this);   //注意有重载
}

DataBase * XClientApp::getDataBase()   //获取本地数据库并进行操作
{
    return m_pDataBase;
}

 

 

以上是关于QT 创建本地数据库(SQLite数据库)存储数据的主要内容,如果未能解决你的问题,请参考以下文章

Qt:将数据库存储/创建到用户空间

Unity3D中操作Sqlite创建本地数据库实现增删改查

安卓使用SQLite将数据存储在本地并做简单处理的学习1

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

[QT][SQL]sql学习记录5_sqlite视图(View)

SQLite数据库存储