【问题标题】:JSON, Javascript & Dynamically Created & Populated TablesJSON、Javascript 和动态创建和填充的表
【发布时间】:2009-12-31 04:12:04
【问题描述】:

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

变量 arrTable = [{“表”:“tblConfig”, “定义”: [{“列”:“属性”,“类型”:“文本不为空”}, {“列”:“值”,“类型”:“文本不为空”}], “数据”: [{“属性”:“版本号”,“值”:“1.0”}, {“属性”:“发布日期”,“价值”:“2010-01-01”}] }]

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

属性_______价值____
版本号 1.0
发布日期 2010-01-01

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

dbController.updateDatabase = function () {
  this.db.transaction(函数(事务){
//加载数据.json
    var dbDefs = dbController.jsonObject(url + "data.json")
//解析数组“表”
    评估(dbDefs);
    for(arrTables 中的变量 i){
      createTable(arrTables[i].table, arrTables[i].def, arrTables[i].data);
    }
//创建表
    函数创建表(表,arrDef,arrData){
      var arrColumns = [];
      var strSQL = "创建表 " + 表 + " (";
      for (arrDef 中的变量 j) {
        arrColumns.push(arrDef[j].column);
        strSQL += arrDef[j].column + " " + arrDef[j].type + ", ";
      }
      strSQL = strSQL.substring(0, strSQL.lastIndexOf(",")) + ")";
      transaction.executeSql(strSQL, [],
        功能 () {
          console.log(table + "created.");
          填充表(表,arrData);
          返回;
        },
        dbController.errorHandler
      );
    }
//填充表
    函数填充表(表,arrData){
      ...
    }
  });
};

我希望能够从“数据”对象中获取列名(“属性”和“值”)并在插入 SQL 字符串中使用它们。我认为这样的事情会奏效。

//填充表格
    函数填充表(表,arrColumns,arrData){
      变量 strVal;
      变量 arrVal;
      for (arrData 中的变量 k) {
        strVal = "?,";
        arrVal.push(arrData[k]. ~~ 键值名称 ~~ )
      }
      var strSQL =“插入”+表+“(”+strCol+“)”;
      strSQL += "值 (" + strVal.lastIndexOf(",") + ");";
      transaction.executeSql(strSQL, arrVal, null, dbController.errorHandler);
      console.log(" " + table + "填充。");
    }

问题在于 粗体 语句。我尝试在 arrData 上使用 .hasOwnProperty() ,但它只返回 0 和 1,而不是“属性”和“值”这两个词。我不想使用“arrData[k].Property”表示法,因为架构中有更多的表,我不想为每个表编写创建和插入语句。

非常感谢任何帮助。


由于我的深夜帖子,感谢大家的帮助和令人头疼的问题。我使用这个函数的目的是拥有一个定义多个表并保存表数据的 JSON 对象。由于没有一个表具有相同数量的列或列名,因此我必须设计一种方法,在不使用 object.member 语法的情况下从“数据”中获取数据。我忘记了 object["member"] 语法。
这是解决方案。
dbController.updateDatabase = function (a) {
  this.db.transaction(函数(事务){
//加载数据.json
    var dbDefs = dbController.jsonObject(dbController.dbFolder + "data.json")
//解析数组“表” 评估(dbDefs); for(arrTables 中的变量 i){ createTable(arrTables[i].table, arrTables[i].def, arrTables[i].data); } //创建表 函数创建表(表,arrDef,arrData){ var arrColumns = []; var strSQL = "创建表" + 表 + " ("; for(arrDef 中的变量 j){ arrColumns.push(arrDef[j].column); strSQL += arrDef[j].column + " " + arrDef[j].type + ", "; } strSQL = strSQL.substring(0, strSQL.lastIndexOf(",")) + ")"; transaction.executeSql(strSQL, [], 功能() { console.log(table + "created."); 填充表(表,arrColumns,arrData); 返回; }, dbController.errorHandler ); } //填充表格 函数填充表(表,arrColumns,arrData){ for (arrData 中的变量 k) { var arrVal = []; var strVal = ""; for (var l = 0; l

【问题讨论】:

  • 您的transaction.executeSQL 是否需要一个平面数组(只有 1 条记录)或一个数组数组,每个数组代表一条记录?

标签: javascript database json html


【解决方案1】:

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

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);

改为

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      在 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 + "]")
          }
      }
      

      【讨论】:

      • 他只有 1 个 INSERT,因为他使用的是准备好的语句(在 Javascript 中!)
      • 啊,对。在他的原始代码中,他只是执行一次查询,而不是实际为每个数据值使用准备好的语句。部分问题在于他的示例函数是如此不完整,以至于很难说出他想要做什么。无论如何,查询如何工作的细节并不重要,我认为他可以弄清楚,我只是想展示循环如何工作。
      猜你喜欢
      • 2014-04-15
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 2019-08-07
      • 2014-12-26
      • 1970-01-01
      • 2017-06-28
      相关资源
      最近更新 更多