QT QML中SQLite的數據庫路徑

我們在用QT Quick的QML編寫前端界面時,常常會用到前端SQLite數據庫以保持本地的數據,此時你不需要用C++,直接用QML就可以了。

當編寫完成代碼後,你卻不知道數據放在哪裏了,實際上QT在你的代碼完成後,會把數據庫放在一個缺省的目錄,本文以win10爲爲例,來說明如何定製化你的SQLite的缺省路徑。

注意:
本文是從一個數據庫操作項目中,節選的一部分內容,可參考
課程:

  1. 《QML SQLite數據庫編程》
  2. 《QT QML跨平臺移動APP編程》

首先創建QT 的項目文件,選擇 New File or Project / Application / Qt Quick Application-Empty,然後輸入項目名稱就可以了。

我們引入項目對數據庫操作的js文件:DataBase.js,內容爲數據庫操作的代碼。


function dbInit()
{
    var db = LocalStorage.openDatabaseSync("mySQLite", "1.0", "This is only for demo", 1000000)
    try {
        db.transaction(function (tx) {
            tx.executeSql('CREATE TABLE IF NOT EXISTS myclass (name text, teacher text)')
        })
        console.log("Table Created!")
    } catch (err) {
        console.log("Error creating table in database: " + err)
    };
}

function dbGetHandle()
{
    try {
        var db = LocalStorage.openDatabaseSync("mySQLite", "1.0", "This is only for demo", 1000000)
    } catch (err) {
        console.log("Error opening database: " + err)
    }
    return db
}

function dbInsert(name, teacher)
{
    var db = dbGetHandle()
    var rowid = 0;
    db.transaction(function (tx) {
        tx.executeSql('INSERT INTO myclass VALUES(?, ?)',
                      [name, teacher])
        var result = tx.executeSql('SELECT last_insert_rowid()')
        rowid = result.insertId
    })
    return rowid;
}

function dbReadAll()
{
    var db = dbGetHandle()
    db.transaction(function (tx) {
        var results = tx.executeSql(
                    'SELECT rowid,name,teacher FROM myclass order by rowid desc')
        for (var i = 0; i < results.rows.length; i++) {
            listModel.append({
                                 id: results.rows.item(i).rowid,
                                 name: results.rows.item(i).name,
                                 teacher: results.rows.item(i).teacher
                             })
        }
    })
}

function dbUpdate(name, teacher,Prowid)
{
    var db = dbGetHandle()
    db.transaction(function (tx) {
        tx.executeSql(
                    'update myclass set name=?, teacher=? where rowid = ?', [name, teacher,Prowid])
    })
}

function dbDeleteRow(Prowid)
{
    var db = dbGetHandle()
    db.transaction(function (tx) {
        tx.executeSql('delete from myclass where rowid = ?', [Prowid])
    })
}

main.qml 的代碼如下:

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import QtQuick.LocalStorage 2.12
import "DataBase.js" as JS // 引入我們的JS文件

ApplicationWindow {
    visible: true
    width: 540
    height: 960

    title: qsTr("QML SQLite")

    Component.onCompleted: {
        JS.dbInit() // JS的文件初始化
    }
}

這時如果運行程序,我們發現SQLite的路徑是:

C:\Users\james\AppData\Local\QMLSQLite\QML\OfflineStorage\Databases,你可以在這個目錄下找到相應的數據庫文件,可以通過SQLiteStudio打開。

這裏james是我的用戶名,你用自己的用戶名,就可以看到你的路徑了。

那麼如何定製我們的SQLite路徑了?

看一下main.cpp文件:

#include <QGuiApplication>
#include <QQmlApplicationEngine>

int main(int argc, char *argv[]) {
  QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

  QGuiApplication app(argc, argv);

  QQmlApplicationEngine engine;
  const QUrl url(QStringLiteral("qrc:/main.qml"));
  QObject::connect(
      &engine, &QQmlApplicationEngine::objectCreated, &app,
      [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
          QCoreApplication::exit(-1);
      },
      Qt::QueuedConnection);

  engine.setOfflineStoragePath("d://myappdir");

  engine.load(url);

  return app.exec();
}

注意我們在代碼中,增加了
engine.setOfflineStoragePath(“d://myappdir”);

這表明我們的數據庫路徑,設置在了d:\myappdir目錄下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章