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.的商标。所有其他商标均为其各自所有者的财产。