SQLite SQLファイルをWeb SQLデータベースにインポートする最も簡単な方法は何ですか
-
26-09-2019 - |
質問
たぶん私は何かが欠けているかもしれませんが、私は大量のデータが事前に入力されたクライアント側のデータベースが必要です。
クライアント側のデータベースがタスクに属しているかどうかをテストするために、私は次のようにダミーデータを使用していくつかのダミーテーブルを作成しました transaction.executeSql()
方法。しかし、私が収集できるものから、それはすべての単一の作成テーブルとクエリに挿入するすべてのすべてのexecutesQL呼び出しを必要とします。私は怠け者です、そしてそれは私にはあまりにも多くの仕事のようです。
私は疑問に思っています...:SQLite GUIを使用してSQLiteテーブルをかなり迅速に作成できます。 SQLファイルをエクスポートし、すべてを1つのexecutesQLステートメントで実行しようとしましたが、最初の 'Create Table'ビットは挿入物なしで処理します。
一度に複数のクエリを実行することを知らないトランザクションオブジェクトの特別な方法はありますか?
これは、モバイルサファリ購入方法です。 Appleによると SQLiteデータベースを使用して、クライアントサイドデータベースのものを強化します。
解決
すべてのSQLコードを1行ごとに1つのコマンドを持つファイルに入れ、Ajaxを使用して、各行を[SQL]を実行する各行の上にファイルを引いてループします
ヒント:存在しない場合は、データベースを開始するために毎回呼び出すことができます
他のヒント
コマンドライン(Linuxボックス)で、
sqlite3 myDatabase.sqlite .dump > myDatabase.sql
これで、SQLiteファイルがプレーンSQLファイルにダンプされています。作成テーブルステートメントと挿入ステートメントが含まれます。
次に、一部のクライアントサイドコード(おそらくいくつかの調整が必要になりますが、アイデアが得られます)
まず、SQLダンプをつかみます。 (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');
});
ProcessQuery関数は、すべてのステートメントを1つずつ処理し、静かにエラーを無視します。
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!");
}
}