Qt Quick Local Storage QML Types

这是一种单例类型,用于读写 SQLite 数据库。

方法

  • 对象 openDatabaseSync(字符串名称、字符串版本、字符串描述、int estimated_size、jsobject callback(db))

详细说明

要使用本模块中的类型,请导入模块并使用LocalStorage 类型调用相关函数:

import QtQuick
import QtQuick.LocalStorage

Item {
    Component.onCompleted: {
        var db = LocalStorage.openDatabaseSync(...)
    }
}

这些数据库是特定于用户和 QML 的,但所有 QML 应用程序都可访问。它们存储在Databases 子目录QQmlEngine::offlineStoragePath() 中,目前是 SQLite 数据库。

数据库连接会在 Javascript 垃圾回收时自动关闭。

可通过 QML 中的 JavaScript 函数使用 API:

import QtQuick

Rectangle {
    color: "white"
    width: 200
    height: 100

    Text {
        text: "?"
        anchors.horizontalCenter: parent.horizontalCenter
        function findGreetings() {
            var db = openDatabaseSync("QDeclarativeExampleDB", "1.0", "The Example QML SQL!", 1000000);

            db.transaction(
                function(tx) {
                    // Create the database if it doesn't already exist
                    tx.executeSql('CREATE TABLE IF NOT EXISTS Greeting(salutation TEXT, salutee TEXT)');

                    // Add (another) greeting row
                    tx.executeSql('INSERT INTO Greeting VALUES(?, ?)', [ 'hello', 'world' ]);

                    // Show all added greetings
                    var rs = tx.executeSql('SELECT * FROM Greeting');

                    var r = ""
                    for (var i = 0; i < rs.rows.length; i++) {
                        r += rs.rows.item(i).salutation + ", " + rs.rows.item(i).salutee + "\n"
                    }
                    text = r
                }
            )
        }
        Component.onCompleted: findGreetings()
    }
}

该 API 符合 HTML5 Web 数据库 API 的同步 API(W3C 工作草案2009 年 10 月 29 日)。

SQL 本地存储示例演示了离线存储 API 的基本使用方法。

打开或创建数据库

import QtQuick.LocalStorage as Sql

db = Sql.openDatabaseSync(identifier, version, description, estimated_size, callback(db))

上述代码返回由标识符标识的数据库。标识符是包含数据库的物理文件名(带或不带相对路径)。descriptionestimated_size将写入 INI 文件(如下所述),但目前未使用。

可能抛出代码属性为 SQLException.DATABASE_ERR 或 SQLException.VERSION_ERR 的异常。

首次创建数据库时,也会创建一个 INI 文件来指定其特性:

标识符传递给openDatabase()
版本传入的数据库版本openDatabase()
描述数据库的描述openDatabase()
估计大小传入的数据库估计大小(以字节为单位openDatabase()
驱动程序目前为 "QSQLITE

应用工具可使用此数据。

db.changeVersion(from, to, callback(tx))

该方法允许执行方案升级。如果成功,它将返回一个版本为to 的新数据库对象。否则返回未定义的结果。

如果db的当前版本不是from,则会出现异常。

否则,将创建一个数据库事务并传递给callback。在该函数中,可以调用tx上的executeSql来升级数据库。

可能会抛出代码属性为 SQLException.DATABASE_ERR 或 SQLException.UNKNOWN_ERR 的异常。

请参见下面的示例。

    var db = LocalStorage.openDatabaseSync("ActivityTrackDB", "", "Database tracking sports
activities", 1000000); if (db.version == "0.1") { db.changeVersion("0.1", "0.2", function(tx) {
            tx.executeSql("INSERT INTO trip_log VALUES(?, ?, ?)",
                        [ "01/10/2016","Sylling - Vikersund", "53" ]);
        }
    });

db.transaction(callback(tx))

该方法创建一个读/写事务并传递给callback。在此函数中,您可以调用tx上的executeSql来读取和修改数据库。

如果回调抛出异常,事务将回滚。下面是一个捕获异常的数据库事务示例。

{
    let db = LocalStorage.openDatabaseSync("Activity_Tracker_DB", "", "Track exercise", 1000000)
    try {
        db.transaction(function (tx) {
            tx.executeSql('CREATE TABLE IF NOT EXISTS trip_log (date text,trip_desc text,distance numeric)')
        })
    } catch (err) {
        console.log("Error creating table in database: " + err)
    };
}

在该示例中,您可以看到一条insert 语句,其中为字段赋值,并将记录写入表中。这是一条insert 语句,其语法在关系数据库中很常见。不过,也可以使用 JSON 对象并将其存储到表中。

让我们举一个简单的例子,使用date 作为唯一键,以 JSON 格式存储行程。下面是一个可用于此目的的表的示例:

create table trip_log(date text, data text)

为 JSON 对象赋值:

var obj = {description = "Vikersund - Noresund", distance = "60"}

在这种情况下,可以按以下方式保存数据:

db.transaction(function(tx) {
    result = tx.executeSQL("insert into trip_log values (?,?)",
                           ["01/11/2016", JSON.stringify(obj)])

db.readTransaction(callback(tx))

该方法会创建一个只读事务并传递给callback。在此函数中,可以调用tx上的executeSql来读取数据库(使用select 语句)。

results = tx.executeSql(statement, values)

该方法执行 SQL语句将值列表与 SQL 位置参数("?")绑定。

它返回一个结果对象,并具有以下属性:

类型属性适用性
introws.length结果中的行数SELECT
变量rows.item(i)返回结果中第 i行的函数SELECT
int受影响行数受修改影响的行数更新、删除
字符串insertId插入记录的 id插入

可能抛出代码属性为 SQLException.DATABASE_ERR、SQLException.SYNTAX_ERR 或 SQLException.UNKNOWN_ERR 的异常。

请参阅下面的示例:

function dbReadAll()
{
    let db = dbGetHandle()
    db.transaction(function (tx) {
        let results = tx.executeSql(
                'SELECT rowid,date,trip_desc,distance FROM trip_log order by rowid desc')
        for (let i = 0; i < results.rows.length; i++) {
            listModel.append({
                                 id: results.rows.item(i).rowid,
                                 checked: " ",
                                 date: results.rows.item(i).date,
                                 trip_desc: results.rows.item(i).trip_desc,
                                 distance: results.rows.item(i).distance
                             })
        }
    })
}

方法文档

object openDatabaseSync(string name, string version, string description, int estimated_size,
jsobject callback(db))

根据给定参数打开或创建本地存储 sql 数据库。

  • name 是数据库名称
  • version 是数据库版本
  • description 是数据库显示名称
  • estimated_size 是数据库的估计大小(以字节为单位
  • callback 是一个可选参数,如果数据库尚未创建,则调用该参数。

返回已创建的数据库对象。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.