Bereiche
News
Rewind
Tipps & Berichte
Forum
Galerie
Journals
Events
Umfragen
Themenwoche
Kleinanzeigen
Interaktiv
Anmelden
Registrierung
Zu allen empfangenen Nachrichten
Suche...
Zur erweiterten Suche
Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum
>
Entwickler
>
Suche "Offline Data Storage" Dokumentation
Suche "Offline Data Storage" Dokumentation
vetterjack
02.09.09
23:20
Hallo
Programmiere gerade eine Mobile Seite für das iPhone und habe nun in einem Buch etwas über "Offline Data storage" gelesen, dass man also eine SQL-Lite Datenbank mit JavaScript erstellen kann.
Bin nun auf der Suche nach einer Dokumentation über dieses Thema.
Google konnte mir bis jetzt noch nicht weiterhelfen.
Hilfreich?
0
Kommentare
MSN_Exploder
02.09.09
23:46
Guggst du hier:
(http://dev.w3.org/html5/webstorage/)
(http://webreflection.blogspot.com/2009/08/w3-html5-storage-what-works-what-does.html)
(http://webkit.org/blog/126/webkit-does-html5-client-side-database-storage/)
Hilft dir hoffentlich aufs erste weiter...
„Es nützt der Freiheit nichts, dass wir sie abschaffen, um sie zu schützen.“
Hilfreich?
0
vetterjack
04.09.09
15:49
Vielen Dank!
Hilfreich?
0
dreyfus
04.09.09
16:00
Das hier auch noch:
...
Hilfreich?
0
vetterjack
05.09.09
19:08
OK, jetzt habe ich wieder genügen Stoff zum durchforsten. Vielen Dank
Hilfreich?
0
vetterjack
11.09.09
19:30
Gibt es hier auch jemanden in Forum, der sich damit auskennt?
Hab jetzt alles wie im Apple-Dokument beschrieben angewendet, aber es funktioniert nicht.
Hilfreich?
0
dreyfus
11.09.09
19:34
Die Frage ist jetzt aber wirklich ein wenig unspezifisch
Was sagt denn das Debugging in Safari? Gibt es Fehlermeldungen? Welche?
Hilfreich?
0
vetterjack
11.09.09
19:59
Hab das aktuelle Webkit Build aufm Mac, und die Konsole zeigt mir keinen Fehler an. Die Datenbank kann angelegt werden, aber Tabellen werden komischerweise nicht angelegt.
Hilfreich?
0
dreyfus
11.09.09
20:34
Kannst Du den Code posten?
Hilfreich?
0
vetterjack
11.09.09
20:59
Klar!
Hier ist der Abschnitt für die Erstellung der Datenbank. Das funktioniert auch noch einwandfrei, denn ich sehe sie im Webkit Build:
function initDB(){
try {
if (!window.openDatabase) {
alert('Leider werden Offline-Datenbanken von ihrem Client nicht unterstützt. Mehr Infos auf http://mactouch.eu !');
} else {
var shortName = 'weppstore';
var version = '1.0';
var displayName = 'Weppstore Database';
var maxSize = 999999; // in bytes
var mydb = openDatabase(shortName, version, displayName, maxSize);
// You should have a database instance in mydb.
}
} catch(e) {
// Error handling code goes here.
if (e == 2) {
// Version number mismatch.
alert("Ihre Datenbank-Version stimmt nicht. Bitte wenden Sie sich an den Support von Limet!");
} else {
alert("Fehler "+e+".");
}
return;
}
}
Und nun soll JS eigentlich eine Tabelle anlegen:
function nullDataHandler(transaction, results) { }
function createTables(db)
{
db.transaction(
function (transaction) {
/* The first query causes the transaction to (intentionally) fail if the table exists. */
transaction.executeSql('CREATE TABLE people(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL DEFAULT "John Doe", shirt TEXT NOT NULL DEFAULT "Purple");', [], nullDataHandler, errorHandler);
/* These insertions will be skipped if the table already exists. */
transaction.executeSql('insert into people (name, shirt) VALUES ("Joe", "Green");', [], nullDataHandler, errorHandler);
transaction.executeSql('insert into people (name, shirt) VALUES ("Mark", "Blue");', [], nullDataHandler, errorHandler);
transaction.executeSql('insert into people (name, shirt) VALUES ("Phil", "Orange");', [], nullDataHandler, errorHandler);
transaction.executeSql('insert into people (name, shirt) VALUES ("jdoe", "Purple");', [], nullDataHandler, errorHandler);
}
);
}
Hilfreich?
0
dreyfus
11.09.09
21:23
Hm, wie rufst Du createTables(db) auf? Kann es sein, dass du die Variable mydb nur innerhalb der Funktion initDB deklariert hast? Dann würde ein Aufruf von createTables(mydb) nicht funktionieren... Versuch' mal
var mydb;
vor die Funktionen zu setzen und dann entsprechend nur noch
mydb = openDatabase(shortName, version, displayName, maxSize);
in der initDB() zu verwenden. Vielleicht war es das.
Hilfreich?
0
vetterjack
11.09.09
21:58
Das verstehe ich jetzt nicht ganz. Was du meinst schon, aber wie ich im Code ändern soll. Könntest du mir bitte den gefallen tun und den komplettgeänderten Code posten?
Hilfreich?
0
dreyfus
11.09.09
22:25
Das sollte bspw. gehen:
<html>
<head>
<title>test</title>
<script language="javascript">
var mydb;
function initDB(){
try {
if (!window.openDatabase) {
alert('Leider werden Offline-Datenbanken von ihrem Client nicht unterstützt. Mehr Infos auf http://mactouch.eu !');
} else {
var shortName = 'weppstore';
var version = '1.0';
var displayName = 'Weppstore Database';
var maxSize = 999999; // in bytes
mydb = openDatabase(shortName, version, displayName, maxSize);
// You should have a database instance in mydb.
}
} catch(e) {
// Error handling code goes here.
if (e == 2) {
// Version number mismatch.
alert("Ihre Datenbank-Version stimmt nicht. Bitte wenden Sie sich an den Support von Limet!");
} else {
alert("Fehler "+e+".");
}
return;
}
}
function nullDataHandler(transaction, results) { }
function errorHandler(transaction, error) {
// Error is a human-readable string.
alert('Oops. Error was '+error.message+' (Code '+error.code+')');
}
function createTables(db)
{
db.transaction(
function (transaction) {
/* The first query causes the transaction to (intentionally) fail if the table exists. */
transaction.executeSql('CREATE TABLE people(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL DEFAULT "John Doe", shirt TEXT NOT NULL DEFAULT "Purple");', [], nullDataHandler, errorHandler);
/* These insertions will be skipped if the table already exists. */
transaction.executeSql('insert into people (name, shirt) VALUES ("Joe", "Green");', [], nullDataHandler, errorHandler);
transaction.executeSql('insert into people (name, shirt) VALUES ("Mark", "Blue");', [], nullDataHandler, errorHandler);
transaction.executeSql('insert into people (name, shirt) VALUES ("Phil", "Orange");', [], nullDataHandler, errorHandler);
transaction.executeSql('insert into people (name, shirt) VALUES ("jdoe", "Purple");', [], nullDataHandler, errorHandler);
}
);
}
</script>
</head>
<body onLoad="initDB(); createTables(mydb);">
...
</body>
</html>
Hilfreich?
0
vetterjack
12.09.09
09:28
Hey, vielen Dank. Jetzt sehe ich auch die Tabelle "people" in der Datenbank. Kann sein, dass ich mich nochmals an dich wenden muss, nun kommt der Teil mit dem Auslesen, und ob da alles funktionieren wird?
Hilfreich?
0
iThinkDifferent
12.09.09
11:23
Ich würde gerne mal wissen, wann dieses Feature in Firefox einzieht. Momentan gehts ja nur mit Google Gears, ich würde aber gern auf ein Plugin verzichten. Nur auf der Mozilla-Seite finde ich nichts.
Hilfreich?
0
vetterjack
12.09.09
14:05
iThinkDifferent
Ich würde gerne mal wissen, wann dieses Feature in Firefox einzieht. Momentan gehts ja nur mit Google Gears, ich würde aber gern auf ein Plugin verzichten. Nur auf der Mozilla-Seite finde ich nichts.
Mozilla muss HTML5 implementieren. Denn Offline Data Storage ist ein Feature von HTML5.
Hilfreich?
0
vetterjack
12.09.09
14:29
Nächste Fragen:
Wo kommt die Abfrage der Daten hin?
function dataHandler(transaction, results)
{
// Handle the results
var string = "Green shirt list contains the following people:\n\n";
for (var i=0; i<results.rows.length; i++) {
// Each row is a standard JavaScript array indexed by
// column names.
var row = results.rows.item(i);
string = string + row['name'] + " (ID "+row['id']+")\n";
}
alert(string);
}
db.transaction(
function (transaction) {
transaction.executeSql("SELECT * from people where shirt='Green';",
[], // array of values for the ? placeholders
dataHandler, errorHandler);
}
);
Und wie muss ich das Script umschreiben, um einfach z.B. eine Einstellung abzufragen? Etwa so:
document.getElementById('meindiv').style.visibility = ['hidden'];
Dieses hidden soll aus der Datenbank ausgelesen werden.
Hilfreich?
0
sierkb
12.09.09
14:52
vetterjack
Mozilla muss HTML5 implementieren.
Tut man dort. Man nimmt nur nicht zur selben Zeit wie das WebKit-Team dieselben Dinge in Angriff und konzentriert sich halt auf andere Dinge des bisherigen HTML5- bzw. XHTML5-Entwurfs bzw. nähert sich dem Ganzen aus einer anderen Richtung. Abgesehen davon ist HTML5/XHTML5 immer noch Draft, die Spezifikation ändert sich noch laufend. Also ist man seitens der Browser-Hersteller auch entsprechend vorsichtig, weil man sonst ständig irgendwo was ändern und nachbessern müsste, um mit der noch unfertigen und in Arbeit befindlichen Spezifikation konform zu bleiben.
Mozilla Developer: Offline resources in Firefox
Im kommenden Firefox 3.6 wird das Thema "Offline resources and data storage" dann noch weiter ausgebaut:
dreyfus:
<script language="javascript">
Wann stirbt so ein sinnfreier Schwachfug eigentlich endlich mal mal aus?
Richtig wäre
<script type="text/javascript">
, noch richtiger gemäß RFC4329 wohl
<script type="application/javascript">
oder
<script type="application/ecmascript">
im Falle von ECMAScript...
Hilfreich?
0
iThinkDifferent
12.09.09
15:43
skierb
Im kommenden Firefox 3.6 wird das Thema "Offline resources and data storage" dann noch weiter ausgebaut:
Aber leider nur für Addons und XUL.
Hilfreich?
0
dreyfus
12.09.09
17:37
vetterjack:
Beispiel:
<html>
<head>
<title>test</title>
<script type="text/javascript">
var mydb;
function initDB(){
try {
if (!window.openDatabase) {
alert('Leider werden Offline-Datenbanken von ihrem Client nicht unterstützt. Mehr Infos auf http://mactouch.eu !');
} else {
var shortName = 'weppstore';
var version = '1.0';
var displayName = 'Weppstore Database';
var maxSize = 999999; // in bytes
mydb = openDatabase(shortName, version, displayName, maxSize);
// You should have a database instance in mydb.
}
} catch(e) {
// Error handling code goes here.
if (e == 2) {
// Version number mismatch.
alert("Ihre Datenbank-Version stimmt nicht. Bitte wenden Sie sich an den Support von Limet!");
} else {
alert("Fehler "+e+".");
}
return;
}
}
function nullDataHandler(transaction, results) { }
function errorHandler(transaction, error) { }
function createTables(db)
{
db.transaction(
function (transaction) {
/* The first query causes the transaction to (intentionally) fail if the table exists. */
transaction.executeSql('CREATE TABLE people(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL DEFAULT "John Doe", shirt TEXT NOT NULL DEFAULT "Purple");', [], nullDataHandler, errorHandler);
/* These insertions will be skipped if the table already exists. */
transaction.executeSql('insert into people (name, shirt) VALUES ("Joe", "Green");', [], nullDataHandler, errorHandler);
transaction.executeSql('insert into people (name, shirt) VALUES ("Jim", "Green");', [], nullDataHandler, errorHandler);
transaction.executeSql('insert into people (name, shirt) VALUES ("Mark", "Blue");', [], nullDataHandler, errorHandler);
transaction.executeSql('insert into people (name, shirt) VALUES ("Phil", "Orange");', [], nullDataHandler, errorHandler);
transaction.executeSql('insert into people (name, shirt) VALUES ("jdoe", "Purple");', [], nullDataHandler, errorHandler);
}
);
}
function dataHandler(transaction, results)
{
// Handle the results
var string = "<h3>Green Shirt List:</h3>";
string = string + '<table cellspacing="4"><tr><th>Name</th><th>ID</th></tr>';
for (var i=0; i<results.rows.length; i++) {
// Each row is a standard JavaScript array indexed by
// column names.
var row = results.rows.item(i);
string = string + "<tr><td>" + row['name'] + "</td><td>" + row['id'] +"</td></tr>";
}
string = string + "</table>";
document.getElementById('queryResult').innerHTML = string;
}
function dieGruenen(db)
{
db.transaction(
function (transaction) {
transaction.executeSql("SELECT * from people where shirt='Green';",
[], // array of values for the ? placeholders
dataHandler, errorHandler);
}
);
}
</script>
</head>
<body onLoad="initDB(); createTables(mydb); dieGruenen(mydb);">
<span id="queryResult"></span>
</body>
</html>
Genauso, wie ich hier
document.getElementById('queryResult').innerHTML = string;
nutze, kannst Du auch
document.getElementById('meindiv').style.visibility = row['name'];
verwenden, wobei natürlich "row" auf die aktuelle Ergebnisreihe verweist (wie im Beispiel) und 'name' der Bezeichner einer existierenden Tabellenspalte sein muss.
Hilfreich?
0
vetterjack
12.09.09
22:07
Wenn ich meine Variante Anwenden will, muss ich dann auch diesen Code davor setzen:
var string = "<h3>Green Shirt List:</h3>";
string = string + '<table cellspacing="4"><tr><th>Name</th><th>ID</th></tr>';
for (var i=0; i<results.rows.length; i++) {
// Each row is a standard JavaScript array indexed by
// column names.
var row = results.rows.item(i);
string = string + "<tr><td>" + row['name'] + "</td><td>" + row['id'] +"</td></tr>";
}
string = string + "</table>";
??
Aber schonmal vielen Dank!
Hilfreich?
0
dreyfus
13.09.09
00:12
Naja, wenn Du keine Tabelle ausgeben willst, musst Du auch den Code dafür nicht schreiben. Essentiell sind eigentlich nur die "for" Schleife - diese durchläuft alle Datensätze, die von der Abfrage zurückgegeben wurden und die Zuweisung "var row = results.rows.item(i);", diese enthält den aktuellen Datensatz. Was Du dann mit den über row['Feldname'] ausgelesenen Daten machst ist dir überlassen
Hilfreich?
0
Kommentieren
Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.
Mac mini M4
iPad Pro M4 wird grün – Displayfehler bei immer...
PIN-Code erraten: Dauer
Apple kündigt Systemupdates für heute Abend an ...
iPad Pro M4: Hinweise auf geringere Nachfrage
Apple gewährt Einblick in Audio- und Video-Test...
Kurz: Apple bietet iPhone 15 erstmals refurbish...
Das MacBook Pro M4