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))
上述代码返回由标识符标识的数据库。标识符是包含数据库的物理文件名(带或不带相对路径)。description和estimated_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 位置参数("?")绑定。
它返回一个结果对象,并具有以下属性:
类型 | 属性 | 值 | 适用性 |
---|---|---|---|
int | rows.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.