JSON,Javascript&动态创建&填充表

时间:2009-12-31 04:12:04

标签: javascript database json html5

我有以下JSON结构,它定义了一个表及其数据。

var arrTable = 
  [{"table": "tblConfig",
  "def":
    [{"column": "Property", "type": "TEXT NOT NULL"},
     {"column": "Value",    "type": "TEXT NOT NULL"}],
  "data":
    [{"Property": "VersionNumber", "Value": "1.0"},
     {"Property": "ReleaseDate",   "Value": "2010-01-01"}]
  }]

代码描述了一个名为“tblConfig”的表,其中包含两列,“Property”和“Value”都是“TEXT NOT NULL”类型。该表有两行数据。

Property_______Value_____
VersionNumber  1.0
ReleaseDate    2010-01-01

下面是我创建和填充表格的Javascript代码。它构建了创建表SQL很棒,但我遇到了填充函数的问题。

dbController.updateDatabase = function () {
  this.db.transaction(function (transaction) {
//load data.json
    var dbDefs = dbController.jsonObject(url + "data.json")
//parse array "table"
    eval(dbDefs);
    for (var i in arrTables) {
      createTable(arrTables[i].table, arrTables[i].def, arrTables[i].data);
    }
//create table
    function createTable(table, arrDef, arrData) {
      var arrColumns = [];
      var strSQL = "CREATE TABLE " + table + " (";
      for (var j in arrDef) {
        arrColumns.push(arrDef[j].column);
        strSQL += arrDef[j].column + " " + arrDef[j].type + ", ";
      }
      strSQL = strSQL.substring(0, strSQL.lastIndexOf(",")) + ")";
      transaction.executeSql(strSQL, [],
        function () {
          console.log(table + " created.");
          populateTable(table, arrData);
          return;
        },
        dbController.errorHandler
      );
    }
//populate table
    function populateTable(table, arrData) {
      ...
    }
  });
};

我希望能够从“data”对象中获取列名(“Property”和“Value”),并在插入SQL字符串中使用它们。我觉得这样的事情会起作用。

//populate table
    function populateTable(table, arrColumns, arrData) {
      var strVal;
      var arrVal;
      for (var k in arrData) {
        strVal = "?,";
        arrVal.push(arrData[k]. ~~ KEY VALUE NAME ~~ )
      }
      var strSQL = "INSERT INTO " + table + " (" + strCol + ") ";
      strSQL += "VALUES (" + strVal.lastIndexOf(",") + ");";
      transaction.executeSql(strSQL, arrVal, null, dbController.errorHandler);
      console.log("  " + table + " populated.");
    }

bugger是粗体语句。我尝试在arrData上使用.hasOwnProperty(),但只返回0和1,而不是单词“Property”和“Value”。我不想使用“arrData [k] .Property”表示法,因为模式中有更多的表,我不想为每个表编写create和insert语句。

非常感谢任何帮助。

<小时/> 由于我的深夜帖子,感谢大家的帮助和头疼。我对此函数的意图是拥有一个JSON对象,该对象定义了多个表并保存了表的数据。由于没有一个表具有相同数量的列或列名称,因此我必须设计一种在不使用object.member语法的情况下从“数据”中获取数据的方法。我忘记了object["member"]语法 这是解决方案。
dbController.updateDatabase = function (a) {
  this.db.transaction(function (transaction) {
//load data.json
    var dbDefs = dbController.jsonObject(dbController.dbFolder + "data.json")
//parse array "table"
    eval(dbDefs);
    for(var i in arrTables) {
      createTable(arrTables[i].table, arrTables[i].def, arrTables[i].data);
    }
//create table
    function createTable(table, arrDef, arrData){
      var arrColumns = [];
      var strSQL = "Create Table " + table + " (";
      for(var j in arrDef) {
        arrColumns.push(arrDef[j].column);
        strSQL += arrDef[j].column + " " + arrDef[j].type + ", ";
      }
      strSQL = strSQL.substring(0, strSQL.lastIndexOf(",")) + ")";
      transaction.executeSql(strSQL, [],
        function() {
          console.log(table + " created.");
          populateTable(table, arrColumns, arrData);
          return;
        },
        dbController.errorHandler
      );
    }
//populate table
    function populateTable(table, arrColumns, arrData) {
      for (var k in arrData) {
        var arrVal = [];
        var strVal = "";
        for (var l = 0; l < arrColumns.length; l++) {
          strVal += "?,";
          arrVal.push(arrData[k][arrColumns[l]])
        }
        var strSQL = "Insert Into "+table+" (" + arrColumns.toString()+") ";
        strSQL += "Values ("+strVal.substring(0, strVal.lastIndexOf(","))+");";
        transaction.executeSql(strSQL, arrVal, null, dbController.errorHandler);
      }
      console.log("  " + table + " populated.");
    }
  });
};

3 个答案:

答案 0 :(得分:0)

您是否只想查看“数据”元素的第一行并枚举这些键(假设所有行都相同)?

for (var k in arrData[0]) {...

答案 1 :(得分:0)

在Javascript中,如果您拥有可以通过obj.member访问的成员的对象,您也可以obj["member"]访问它。 JavaScript中的对象本质上只是哈希表,能够调用它们上的方法(它们也只是哈希表中的条目),以及基于原型的继承系统。

无论如何,这意味着您可以使用for ... in迭代该哈希表中的属性,然后拔出密钥。

所以,如果我理解你正在尝试做什么,你可以做这样的事情(请注意,这个循环的结构与你问题中的结构有些不同,因为你需要一个每个要插入的行的INSERT语句,而你的循环在数据行的循环之外构造了INSERT语句):

function populateTable(table, data) {
    for (var k in data) {
        var queryArgs = [];
        var argArray = [];
        var columns = [];

        for (var col in data[k]) {
            queryArgs.push('?');
            columns.push(col);
            argArray.push(data[k][col]);
        }

        var SQL = "INSERT INTO " + table + " (" + columns + ") VALUES " +
            "(" + queryArgs + ");";
        alert(SQL + " [" + argArray + "]")
    }
}

答案 2 :(得分:0)

我在这里做了一些假设,但尝试改变:

for (var k in arrData) {
    strVal = "?,";
    arrVal.push(arrData[k]. ~~ KEY VALUE NAME ~~ )
}
var strSQL = "INSERT INTO " + table + " (" + strCol + ") ";
strSQL += "VALUES (" + strVal.lastIndexOf(",") + ");";

为:

for (var i =0; i < arrColumns.length; ++i) strVal += ',?';
for (var k in arrData)
{
    arrVal[k] = [];
    for (var i in arrColumns) 
        arrVal[k].push (arrData[k][arrColumns[i]]);
}
var strSQL = "INSERT INTO " + table + " (" + strCol + ") ";
strSQL += "VALUES (" + strVal.substr(1) + ");";

如果我认为transaction.executeSql(strSQL, arrVal, null, dbController.errorHandler);接受多条记录是正确的,那么这应该可以正常工作。否则,请致电

transaction.executeSql(strSQL, arrVal[0], null, dbController.errorHandler);

代替