2010-05-14 10 views
7

zu importieren, vielleicht fehlt mir etwas, aber ich brauche eine clientseitige Datenbank mit einer Ladung von Daten gefüllt.Was ist der einfachste Weg, um eine SQLite-SQL-Datei in eine WEB-SQL-Datenbank

Um zu testen, ob clientseitige Datenbanken der Aufgabe gewachsen sind, habe ich einige Dummy-Tabellen mit Dummy-Daten mit der Methode transaction.executeSql() erstellt. Aber von dem, was ich sammeln kann, erfordert es einen executeSQL-Aufruf für jede einzelne CREATE TABLE- und INSERT INTO-Abfrage. Ich bin faul, und das scheint mir zu viel Arbeit zu sein.

Ich frage mich ...: Ich kann eine SQLite-Tabelle relativ schnell mit einer SQLite GUI erstellen. Ich habe versucht, eine SQL-Datei zu exportieren und alles in einer executeSQL-Anweisung auszuführen, aber das erste "CREATE TABLE" -Bit verarbeitet keine der Einfügungen.

Gibt es eine spezielle Methode des Transaktionsobjekts, die mir nicht bekannt ist, um mehrere Abfragen gleichzeitig auszuführen?

Dies ist für Mobile Safari kaufen den Weg, die according to Apple verwendet eine SQLite-Datenbank, um ihre clientseitige Datenbank Zeug.

Antwort

2

ich alle SQL setzen Code in eine Datei mit einem Befehl pro Zeile

Spitze der SQL-dann Ajax verwendet Datei und Schleife über jede Zeile zu ziehen Ausführung: die verwendet werden, wenn nicht, so dass es Sie gibt jedes Mal anrufen Ihre Datenbank

+0

Bitte, können Sie einige Teile des Codes zur Verfügung stellen? Ich habe das gleiche Problem und kann eine SQL-Skriptdatei nicht in eine Web-SQL-Datenbank laden, die im laufenden Betrieb erstellt wird. – Zakaria

13

auf der Kommandozeile (in einer linux-Box), verwenden

sqlite3 myDatabase.sqlite .dump > myDatabase.sql 

Jetzt haben Sie die sQLite-Datei auf eine Ebene sQL-Datei ausgegeben init. Es enthält die create table-Anweisungen und die insert-Anweisungen.

Dann einige Clientside-Code (wird wahrscheinlich einige Einstellungs brauchen, aber Sie bekommen die Idee)

Zuerst greifen die SQL-Dump. (Beispiel mit jQuery)

$.get('./dumps/myDatabase.sql', function(response) { 
    // console.log("got db dump!", response); 
    var db = openDatabase('myDatabase', '1.0', 'myDatabase', 10000000); 
    processQuery(db, 2, response.split(';\n'), 'myDatabase'); 
}); 

Die processQuery Funktionsprozess alle Anweisungen eine nach der anderen, und geräuschlos ignoriert Fehler.

function processQuery(db, i, queries, dbname) { 
    if(i < queries.length -1) { 
     console.log(i +' of '+queries.length); 
     if(!queries[i+1].match(/(INSERT|CREATE|DROP|PRAGMA|BEGIN|COMMIT)/)) { 
     queries[i+1] = queries[i]+ ';\n' + queries[i+1]; 
     return processQuery(db, i+1, queries, dbname); 
     } 
     console.log('------------>', queries[i]); 
     db.transaction(function (query){ 
     query.executeSql(queries[i]+';', [], function(tx, result) { 
      processQuery(db, i +1, queries,dbname); 
     });   
     }, function(err) { 
     console.log("Query error in ", queries[i], err.message);       
     processQuery(db, i +1, queries, dbname); 
     }); 
    } else { 
     console.log("Done importing!"); 
    } 
}