将SQLite SQL文件导入WEB SQL数据库的最简单方法是什么

时间:2010-05-14 13:39:51

标签: sql sqlite safari local-storage

也许我错过了一些东西,但我需要一个预先填充了大量数据的客户端数据库。

为了测试客户端数据库是否符合任务,我使用transaction.executeSql()方法创建了一些带有虚拟数据的虚拟表。但是从我可以收集的内容来看,它需要对每个CREATE TABLE和INSERT INTO查询执行executeSQL调用。我很懒,这对我来说似乎太过分了。

我想知道......:我可以使用SQLite GUI快速创建SQLite表。我已经尝试导出一个SQL文件并在一个executeSQL语句中运行它,但是只处理第一个'CREATE TABLE'位没有插入。

是否有一些特殊的事务对象方法,我不知道一次运行多个查询?

这适用于Mobile Safari购买方式,according to Apple使用SQLite数据库为其客户端数据库提供支持。

2 个答案:

答案 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,这样每次都可以调用它来启动数据库