代码之家  ›  专栏  ›  技术社区  ›  gargantuan

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

  •  7
  • gargantuan  · 技术社区  · 16 年前

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

    为了测试客户端数据库是否能够完成任务,我使用 transaction.executeSql() 方法。但据我所知,它需要为每个CREATE表和INSERT INTO查询调用executeSQL。我很懒,这对我来说似乎太多了。

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

    这是为移动Safari买单的方式,其中 according to Apple 使用SQLite数据库来支持客户端数据库。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Carter Cole    16 年前

    我将所有sql代码放入一个文件中,每行一个命令,然后使用ajax拉取文件并在执行sql的每行上循环

    提示:使用if not exists,以便每次都可以调用它来初始化数据库

        2
  •  16
  •   SchizoDuckie    14 年前

    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!");
      }
    }