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 是包含数据库的物理文件名(带有或不带有相对路径)。 description 和 estimated_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位置参数("?")上。
它返回一个包含以下属性的结果对象
类型 | 属性 | 值 | 适用性 |
---|---|---|---|
int | rows.length | 结果中的行数 | SELECT |
var | rows.item(i) | 返回结果的第i行的函数 | SELECT |
int | rowsAffected | 受修改影响的行数 | UPDATE, DELETE |
string | insertId | 插入的行ID | INSERT |
可能会抛出带有代码属性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.的商标。所有其他商标均为其各自所有者的财产。