Die meisten Apps müssen Konfigurationsdaten wie Servernamen oder Benutzerpräferenzen speichern. Diese Daten sollten von jeder Stelle der App zugreifbar sein, um sich die Übergabe von langen Parameterlisten sparen zu können. Natürlich muss die Speicherung persistent erfolgen, so dass die Konfiguration nicht nach dem Beenden der Applikation verloren geht.
Mein Ansatz besteht aus einem kleinen Javascript, das in alle QML Dateien importiert werden kann und die Daten in einer Datenbank speichert.
Vor dem ersten Start muss der Platzhalter <your app name> durch den Namen der jeweiligen Applikation ersetzt werden.
Die Funktion intialize() muss beim start der App aufgerufen werden. Danach kann mit getSetting() und setSetting() ein Key/Value Pair in der DB gespeichert werden.
Javascript:
Qt.include("QtQuick.LocalStorage")
function getDatabase() {
return LocalStorage.openDatabaseSync("<your app name>", "1.0",
"StorageDatabase", 100000);
}
function initialize() {
var db = getDatabase();
db.transaction(
function(tx) {
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]);
if (rs.rowsAffected > 0) {
res = "OK";
} else {
res = "NOK";
}
});
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 = "";
}
});
return res;
}
Ein dazu passender QML Preferences Dialog könnte dann so aussehen:
import QtQuick 2.0
import Sailfish.Silica 1.0
import QtQuick.LocalStorage 2.0
import "storage.js" as Storage
Dialog {
id: preferencePage
DialogHeader { title: "Save" }
anchors.fill: parent
TextField {
y:200
id:serverName
width: parent.width
label: "Server URL"
placeholderText: "Enter Sever Name"
focus: true
horizontalAlignment: left
}
TextField {
id:deviceId
anchors.top:serverName.bottom
width: parent.width
label: "REMSY Device Name"
placeholderText: "Enter Device Name"
focus: true
horizontalAlignment: left
}
Component.onCompleted: {
Storage.initialize();
serverName.text=Storage.getSetting("serverurl");
deviceId.text=Storage.getSetting("deviceid");
}
onAccepted: {
Storage.setSetting("serverurl", serverName.text)
Storage.setSetting("deviceid", deviceId.text)
}
}
Mein Ansatz besteht aus einem kleinen Javascript, das in alle QML Dateien importiert werden kann und die Daten in einer Datenbank speichert.
Vor dem ersten Start muss der Platzhalter <your app name> durch den Namen der jeweiligen Applikation ersetzt werden.
Die Funktion intialize() muss beim start der App aufgerufen werden. Danach kann mit getSetting() und setSetting() ein Key/Value Pair in der DB gespeichert werden.
Javascript:
Qt.include("QtQuick.LocalStorage")
function getDatabase() {
return LocalStorage.openDatabaseSync("<your app name>", "1.0",
"StorageDatabase", 100000);
}
function initialize() {
var db = getDatabase();
db.transaction(
function(tx) {
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]);
if (rs.rowsAffected > 0) {
res = "OK";
} else {
res = "NOK";
}
});
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 = "";
}
});
return res;
}
Ein dazu passender QML Preferences Dialog könnte dann so aussehen:
import QtQuick 2.0
import Sailfish.Silica 1.0
import QtQuick.LocalStorage 2.0
import "storage.js" as Storage
Dialog {
id: preferencePage
DialogHeader { title: "Save" }
anchors.fill: parent
TextField {
y:200
id:serverName
width: parent.width
label: "Server URL"
placeholderText: "Enter Sever Name"
focus: true
horizontalAlignment: left
}
TextField {
id:deviceId
anchors.top:serverName.bottom
width: parent.width
label: "REMSY Device Name"
placeholderText: "Enter Device Name"
focus: true
horizontalAlignment: left
}
Component.onCompleted: {
Storage.initialize();
serverName.text=Storage.getSetting("serverurl");
deviceId.text=Storage.getSetting("deviceid");
}
onAccepted: {
Storage.setSetting("serverurl", serverName.text)
Storage.setSetting("deviceid", deviceId.text)
}
}