transaction wird nicht ausgeführt
king_pagel
- javascript
Hallo,
ich habe folgende Funktion:
function dbInitialise(){
db.transaction(
function (transaction) {
transaction.executeSql('SELECT * FROM table;', [],
function (transaction, results) {
for (var i=0; i < results.rows.length; ++i) {
if(results.rows.item(i)['key'] === 'h_name'){
updateData('h_name', document.db.h_name.value);
} else {
if(i === (results.rows.length-1)){
setData('h_name', document.db.h_name.value);
}
}
[...]
Wie zu sehen ist, wird dadurch entweder die Funktion set Data oder updateData aufgerufen. Nun zu meinem Problem ;) Die funktion in db.transaction wird nicht ausgeführt. Hat jemand eine Idee, woran das liegen könnte?
function updateData(){
db.transaction(
/* wird nicht ausgeführt - beginn */
function (transaction) {
transaction.executeSql('UPDATE table SET value = "test" WHERE key = "test";', [], null, errorHandler);
}
/* wird nicht ausgeführt - end */
);
}
Vielen Dank für eure Hilfe!
Moin Moin!
Was für ein Object ist db? Gibt es dafür eine Doku?
Alexander
Moin,
ich hab mir diese Doku zur Hilfe genommen:
http://developer.apple.com/documentation/iPhone/Conceptual/SafariJSDatabaseGuide/SafariJSDatabaseGuide.pdf
Mit db wird eine Verbindung zu einer Datenbank hergestellt. Ich müsste eigentlich von überall drauf zurgriff haben. Hab das nämlich nicht in ner Funktion oder ähnliches geschrieben. Siet bei mir wie folgt aus:
try {
if (!window.openDatabase) {
alert('Datenbank konnte nicht geöffnet werden.');
} else {
var shortName = 'my_db_name';
var version = '1.0';
var displayName = 'DB name';
var maxSize = 5242880; // in bytes -> (5MB)
var db = openDatabase(shortName, version, displayName, maxSize);
}
} catch(e) {
var INVALID_STATE_ERR;
if (e == INVALID_STATE_ERR) {
// Version number mismatch.
alert("Die Version der Datenbank ist nicht valide.");
} else {
alert("Unbekannter Fehler "+e+".");
}
return;
}
Hi,
ich habe soeben herausgefunden, dass die Funktionen ab und zu richtig ausgeführt werden. Nun bin ich vollkommen perplex!
Moin Moin!
Das sieht kaputt aus:
try {
if (!window.openDatabase) {
alert('Datenbank konnte nicht geöffnet werden.');
} else {
var shortName = 'my_db_name';
var version = '1.0';
var displayName = 'DB name';
var maxSize = 5242880; // in bytes -> (5MB)
var db = openDatabase(shortName, version, displayName, maxSize);
openDatabase soll wohl eine Exception auslösen, so wie Dein Code aussieht. Tut es das oder liefert es false o.ä.?
db bleibt im Scope der Funktion (in Perl wäre db außerhalb des try-Blockes nicht verfügbar, aber Javascript tickt da etwas anders), und ist nicht global verfügbar. Das könnte Dein Script stören, wenn Du in einer anderen Funktion auf db zugreifen willst.
}
} catch(e) {
var INVALID_STATE_ERR;
if (e == INVALID_STATE_ERR) {
Du vergleichst eine Exception mit einer undefinierten Variable. Ob das gut ist?
// Version number mismatch. alert("Die Version der Datenbank ist nicht valide.");
} else {
alert("Unbekannter Fehler "+e+".");
}
return;
}
Und dann?
Dieses Stück Code liefert an den Rest des Codes KEINERLEI Fehlerstatus zurück. Der Benutzer sieht eine Alertbox, aber der Rest deines Codes außerhalb dieser Funktion wird von den Problemen mit openDatabase nie etwas erfahren.
Alexander
--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".
Dumme Frage:
Kannst man in einer Transaction eine weitere aufmachen? Ich würde versuchen, die bestehende zu übergeben und sie wiederzuverwenden. Das aber rein intuitiv.
Mathias
Dumme Frage:
Kannst man in einer Transaction eine weitere aufmachen? Ich würde versuchen, die bestehende zu übergeben und sie wiederzuverwenden. Das aber rein intuitiv.Mathias
Vielen Dank erstmal für deine Antwort! Könntest du mir dazu ein Beispiel geben? Bin mir nämlich nicht ganz sicher, wie du das meinst ;)
Könntest du mir dazu ein Beispiel geben?
function dbInitialise () {
db.transaction(function (transaction) {
transaction.executeSql(..., function (transaction, results) {
updateData(transaction, ...); // Als Parameter übergeben
});
});
}
function updateData (transaction, ...) { // Als Parameter entgegennehmen
transaction.executeSql(...); // Transaktion wiederverwenden
}
Da führt man natürlich immer noch im Callback des einen executeSql ein weiteres executeSql aus, aber das müsste eigentlich gehen.
Mathias
function selectQuery(db, sqlQuery){ // Funktion 1
/* In die Variable 'result' soll das Ergebnis aus der transaction gespeichert werden. */
var result;
db.transaction(
function (transaction) { // Funktion 2
transaction.executeSql(sqlQuery, [], resultFunction, errorHandler);
}
);
}
function resultFunction(transaction, results){ // Funktion 3
/* result soll zurück gegeben werden */
return results;
}
ich möchte gerne das Result, welches die SQL-Anweisung in der darauf folgenden Funktion erzeugt, zurück geben. Hat jemand eine Idee, wie ich das machen kann?
Das geht so nicht - du denkst hier imperativ, aber die Schnittstelle arbeitet asynchron und Callback-basiert.
Da gibt es so etwas wie »Rückgabe« nicht, Funktion 1, 2 und 3 (ich habe sie oben nummeriert) können einander nichts zurückgeben. Die Funktionen können nicht aufeinander warten, sie werden nicht in einer Aufruf-Abfolge ausgeführt. Wenn Funktion 2 ausgeführt wird, dann ist Funktion 1 längst abgelaufen. Wenn Funktion 3 ausgeführt wird, dann ist Funktion 2 längst abgelaufen. Es ist unmöglich und würde keinen Sinn mehr machen, in Funktion 3 eine lokale Variable in Funktion 3 zu setzen.
Was hast du genau vor? Warum willst du das Resultat in Funktion 1 haben? Wie gesagt geht das ganz grundsätzlich nicht - weil der Zugriff auf das Query-Resultat erst in der Callback-Funktion möglich ist, die asynchron und damit unabhängig von Funktion 1 gestartet wird.
Mathias