8

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

为了测试客户端数据库是否能够胜任这项任务,我使用该transaction.executeSql()方法创建了一些带有虚拟数据的虚拟表。但据我所知,它需要对每个 CREATE TABLE 和 INSERT INTO 查询执行一个 executeSQL 调用。我很懒,这对我来说似乎工作太多了。

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

是否有一些我不知道的交易对象的特殊方法可以同时运行多个查询?

这是为 Mobile Safari 购买的方式,根据 Apple的说法,它使用 SQLite 数据库来支持他们的客户端数据库。

4

2 回答 2

16

在命令行(在 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 函数会一一处理所有语句,并默默地忽略错误。

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!");
  }
}
于 2012-08-05T11:23:36.597 回答
2

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

提示:使用 if not exists 这样你就可以每次调用它来初始化你的数据库

于 2010-09-27T19:24:54.480 回答