【问题标题】:How do I load initial data via javascript? [duplicate]如何通过 javascript 加载初始数据? [复制]
【发布时间】:2013-04-17 01:59:35
【问题描述】:

我想通过文件或任何最好的方式预加载 9000 条记录。我的想法是我想在某个地方有 9000 条记录,我想通过 phonegap 将它们加载到 sqlite 数据库中。除了从某个地方加载数据之外,我还有所有这些工作。这是我到目前为止所拥有的

我有一个文件 records.csv 文件,这是我的代码

function populate_events_from_csv(db){
  var event_data; 
  $.ajax({
      type: "GET",
      url: "records.csv",
      dataType: "text/csv",
      error: function (request, status, error) {
         console.log('fail'); 
        console.log(request.responseText);
      },
      success: function(data) { 
               console.log('success'); 
               event_data = $.csv.toObjects(data); }
   });
   console.log(event_data);
    db.transaction(function(tx) {
    var q = 'INSERT INTO Events (id, name) VALUES (?, ?)';
      _(event_data).each(function(row) {
        tx.executeSql(q, [row.id, row.name]);
      });
    });
}

这种方法可行,但由于记录 csv 中的双引号和单引号而失败

如果有人看到我做错了什么或最初插入这 9000 条记录的另一种解决方案

【问题讨论】:

  • 尝试替换 csv 文件中的引号,例如 var expr = new RegExp('"', 'g'); data = data.replace(expr, '\\"');
  • 你能提供$.csv吗?
  • 为什么您认为引号有问题? executeSqlcsv.toObjects 没有让它们正确吗?如果是,请提供函数的代码和 CSV 示例
  • 您的代码是同步的(这取决于在尝试访问 event_data 之前完成的 ajax 调用)。将数据库访问部分复制并粘贴到成功函数中,或者在您的ajax选项中指定async: false...

标签: javascript jquery file cordova underscore.js


【解决方案1】:
function populate_events_from_csv(db) {
    var event_data;
    $.ajax({
        type: "GET",
        url: "records.csv",
        dataType: "text/csv",
        error: function (request, status, error) {
            console.log('fail');
            console.log(request.responseText);
        },
        success: function (data) {
            console.log('success');
            event_data = $.csv.toObjects(data);
            db.transaction(function (tx) {
                var q = 'INSERT INTO Events (id, name) VALUES (?, ?)';
                _(event_data).each(function (row) {
                    tx.executeSql(q, [row.id, row.name]);
                });
            });
        }
    });

}

【讨论】:

  • 应该_( 不是$(
  • @tucuxi 他可能在使用Underscore.js:underscorejs.org/#each
  • 谢谢;与$(something).each(function(index,object){}) 同名的类似功能让我失望
【解决方案2】:

为什么不将数据转换为 JSON,这样可以更快地加载到您的 javascript(最小解析)中,同时简化您的代码?

一旦 JSON 化,你就可以写了

function populate_events(db, url) {
    $.getJSON(url).done(function(data) {
        db.transaction(function (tx) {
            var q = 'INSERT INTO Events (id, name) VALUES (?, ?)';
            $(data).each(function (index, row) {
                tx.executeSql(q, [row.id, row.name]);
            });
        });
    }).fail(function(request, status, error) {
        console.log('fail');
        console.log(request.responseText);
    });
}

将 CSV 转换为 JSON 留作练习,但有许多工具可以处理该任务。我会使用 Python 脚本(csv + json 库)。

【讨论】:

  • 此外,此代码解决了您原始代码中的 实际 问题:您在分配给它之前尝试使用 event_data。如果您希望原始代码正常工作,请进行 AJAX 调用 async: false
猜你喜欢
  • 1970-01-01
  • 2018-05-20
  • 2018-04-11
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 2011-03-26
  • 2015-12-04
  • 1970-01-01
相关资源
最近更新 更多