Qt Quick 本地存储 QML 类型

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

方法

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

详细描述

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

import QtQuick
import QtQuick.LocalStorage

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

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

数据库连接在 JavaScript 垃圾回收期间自动关闭。

此 API 可从 QML 中的 JavaScript 函数中使用

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 网络数据库 API 的同步 API,W3C 工作草案 2009 年 10 月 29 日

请参阅 SQL Local Storage 示例,以了解离线存储 API 的基本用法。

打开或创建数据库

import QtQuick.LocalStorage as Sql

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

上述代码返回由 identifier 标识的数据库。如果数据库不存在,它将被创建,并且函数 callback 将与数据库作为参数调用。 identifier 是包含数据库的物理文件名(带有或不带有相对路径)。 descriptionestimated_size 将写入以下 INI 文件,但当前未使用。

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

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

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

此数据可由应用程序工具使用。

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

此方法允许您执行 方案升级。如果成功,则返回版本为 to 的新数据库对象。否则返回 undefined

如果 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))

该方法创建一个读/写事务并将其传递给回调函数。在这个函数中,您可以通过在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))

此方法创建一个只读事务并传递给回调。在这个函数中,您可以通过在tx上调用executeSql来使用select语句读取数据库。

results = tx.executeSql(statement, values)

此方法执行一个SQL语句,将值列表绑定到SQL位置参数("?")上。

它返回一个包含以下属性的结果对象

类型属性适用性
introws.length结果中的行数SELECT
varrows.item(i)返回结果的第i行的函数SELECT
introwsAffected受修改影响的行数UPDATE, DELETE
stringinsertId插入的行IDINSERT

可能会抛出带有代码属性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是一个可选参数,当数据库尚未创建时将被调用。

返回创建的数据库对象。

© 2024 The Qt Company Ltd. 有关此处包含的文档贡献的版权属于其各自的所有者。提供的文档受GNU自由文档许可证version 1.3许可条款的约束,由自由软件基金会发布。Qt及其相关标志是芬兰以及/或其他国家的The Qt Company Ltd.的商标。所有其他商标均为其各自所有者的财产。