也许我错过了一些东西,但我需要一个预先填充了大量数据的客户端数据库。
为了测试客户端数据库是否符合任务,我使用transaction.executeSql()
方法创建了一些带有虚拟数据的虚拟表。但是从我可以收集的内容来看,它需要对每个CREATE TABLE和INSERT INTO查询执行executeSQL调用。我很懒,这对我来说似乎太过分了。
我想知道......:我可以使用SQLite GUI快速创建SQLite表。我已经尝试导出一个SQL文件并在一个executeSQL语句中运行它,但是只处理第一个'CREATE TABLE'位没有插入。
是否有一些特殊的事务对象方法,我不知道一次运行多个查询?
这适用于Mobile Safari购买方式,according to Apple使用SQLite数据库为其客户端数据库提供支持。
答案 0 :(得分:13)
在命令行上(在linux框中),使用
sqlite3 myDatabase.sqlite .dump > myDatabase.sql
现在您将sqlite文件转储到普通的sql文件中。它将包含create table语句和insert语句。
然后,一些客户端代码(可能需要一些调整,但你会得到这个想法)
首先,抓住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函数逐个处理所有语句,并默默地忽略错误。
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!");
}
}
答案 1 :(得分:2)
我将所有sql代码放入一个文件中,每行一个命令,然后使用ajax拉取文件并遍历执行sql的每一行
提示:使用if not exists,这样每次都可以调用它来启动数据库