我有以下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."); } }); };
答案 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);
代替