在程序中,我们经常需要把一些数据持久化,比如一些设置信息和程序配置。QML并不能直接访问本地文件,但是可以通过
Offline Storage API访问本地Sqlite数据库,从而达到目的。
首先在qml目录下创建一个storage.js
- //storage.js
- // 首先创建一个helper方法连接数据库
.import QtQuick.LocalStorage 2.0 as Sql
- function getDatabase() {
- return Sql.LocalStorage.openDatabaseSync("MyAppName", "1.0", "StorageDatabase", 100000);
- }
- // 程序打开时,初始化表
- function initialize() {
- var db = getDatabase();
- db.transaction(
- function(tx) {
- // 如果setting表不存在,则创建一个
- // 如果表存在,则跳过此步
- tx.executeSql('CREATE TABLE IF NOT EXISTS settings(setting TEXT UNIQUE, value TEXT)');
- });
- }
- // 插入数据
- function setSetting(setting, value) {
- var db = getDatabase();
- var res = "";
- db.transaction(function(tx) {
- var rs = tx.executeSql('INSERT OR REPLACE INTO settings VALUES (?,?);', [setting,value]);
- //console.log(rs.rowsAffected)
- if (rs.rowsAffected > 0) {
- res = "OK";
- } else {
- res = "Error";
- }
- }
- );
- return res;
- }
- // 获取数据
- function getSetting(setting) {
- var db = getDatabase();
- var res="";
- db.transaction(function(tx) {
- var rs = tx.executeSql('SELECT value FROM settings WHERE setting=?;', [setting]);
- if (rs.rows.length > 0) {
- res = rs.rows.item(0).value;
- } else {
- res = "Unknown";
- }
- })
- return res
- }
然后就可以在qml里调用了
- import Qt 4.7
- //引入storage.js,起个别名Storage,以供后面使用
- import "storage.js" as Storage
- Rectangle {
- width: 360
- height: 360
- id: screen
- Text {
- id: textDisplay
- anchors.centerIn: parent
- }
- Component.onCompleted: {
- // 初始化数据库
- Storage.initialize();
- // 赋值
- Storage.setSetting("mySetting","myValue");
- //获取一个值,并把它写在textDisplay里
- textDisplay.text = "The value of mySetting is:\n" + Storage.getSetting("mySetting");
- }
- }