javascript - 在 sqlite 数据库中存储表单
问题描述
我进行了很多研究,但没有找到适合我的方案的解决方案。我有一个简单的 html/javascript 应用程序,我使用 cordova 打包它。html 页面有一个表单,可以将表单发布到服务器。当应用程序离线或没有可用的互联网连接时,我想将表单保存到 sqlite 数据库。我是 sqlite 的新手,我还没有找到任何兼容的数据类型来将表单存储到数据库。如果我使用 TEXT 或 BLOB,它只存储“[Object HTMLFormObject]”字符串。
请检查我的js代码:
db = window.sqlitePlugin.openDatabase({
name: 'ambdb',
location: 'default'
}, function (db) {
db.transaction(function (tx) {
tx.executeSql('CREATE TABLE IF NOT EXISTS FORMS (form BLOB)');
}, function (err) {
alert('Open database ERROR: ' + JSON.stringify(err));
});
});
function storeForms(formRecieved) {
//alert(formRecieved.toString());
//alert('text(): '+ formRecieved.text());
//var jsonString = JSON.stringify(formRecieved);
//var htmlText = escape(formRecieved.innerHTML);
//var htmlText = formRecieved.innerHTML;
//var simplyString = String(formRecieved);
db.transaction(function (tx) {
tx.executeSql('INSERT INTO FORMS (form) VALUES (?)', [formRecieved]);
}, function (err) {
alert('StoreForms ERROR: ' + JSON.stringify(err));
});
}
function readForms(cb) {
var submittedForms = [];
db.transaction(function (tx) {
tx.executeSql('SELECT form FROM FORMS', [], function (tx, results) {
alert('total items: ' + results.rows.length);
for (var i = 0; i < results.rows.length; i++) {
var row = results.rows.item(i)['form'];
//row = JSON.parse(row);
/*var varstring = row.toString();
alert('tostring: ' + varstring);
var parser=new DOMParser();
var x = parser.parseFromString(varstring, "text/html");
alert('x: '+ x);*/
submittedForms.push(row);
}
cb.call(this, submittedForms);
});
});
}
document.addEventListener("online", function (e) {
alert('I am online');
isConnected = true;
var promise1 = new Promise(function (resolve, reject) {
readForms(function (forms) {
resolve(forms);
});
}).then(function (submittedForms) {
var numberOfRows = submittedForms.length;
alert('submittedForms.length: ' + numberOfRows);
if (numberOfRows > 0) {
for (var i = 0; i < numberOfRows; i++) {
alert('Single row: '+ JSON.stringify(submittedForms[i]));
submittedForms[i].submit();
}
//deleteForms();
return false;
}
})
}, false);
注释代码显示了我尝试来回序列化解析 HTML 对象以将其存储在数据库中的可能方式。请指导我应该使用哪种列数据类型以及如何在代码中处理它。非常感谢!
解决方案
我最终将 HTMLFormObject 转换为 JSON 对象。我将它作为字符串保存在数据库中。在从数据库读取时,我将其解析回 JSON 对象。我正在从这个 JSON 对象创建一个 html 表单。
function storeForms(formRecieved) {
var elements = formRecieved.elements;
var newForm = {};
for (var i = 0; i < formRecieved.length; i++) {
var elementName = elements[i].name;
newForm[elementName] = elements[i].value;
}
var jsonString = JSON.stringify(newForm);
db.transaction(function (tx) {
tx.executeSql('INSERT INTO FORMS (form) VALUES (?)', [JSON.stringify(newForm)]);
}, function (err) {
alert('StoreForms ERROR: ' + JSON.stringify(err));
});
}
function readForms(cb) {
var submittedForms = [];
db.transaction(function (tx) {
tx.executeSql('SELECT form FROM FORMS', [], function (tx, results) {
var row, formToSubmit, input, jsonRow = {};
for (var i = 0; i < results.rows.length; i++) {
row = results.rows.item(i)['form'];
jsonRow = JSON.parse(row);
formToSubmit = createFormToSubmit(jsonRow);
submittedForms.push(formToSubmit);
}
cb.call(this, submittedForms);
});
});
}
function createFormToSubmit(jsonData) {
var formToSubmit = document.createElement("form");
var keys = Object.keys(jsonData);
var fieldName, input;
for (var i = 0; i < keys.length; i++) {
fieldName = keys[i];
input = document.createElement("input");
input.type = "text";
input.name = keys[i];
input.value = jsonData[fieldName];
formToSubmit.appendChild(input);
}
formToSubmit.setAttribute('method', "post");
formToSubmit.setAttribute('action', "https:url");
formToSubmit.setAttribute('target', "transFrame");
return formToSubmit;
}
推荐阅读
- python-3.x - 每单位令牌python函数拆分一个数字
- opencl - pyopencl,找不到匹配的设备
- linux - 使用脚本检查 git 分支是否在另一个之前
- javascript - 如何使用 jquery 获取 div 的值?
- java - 如何使用 apache commons csv 使用具有多个字符的分隔符
- excel - 如果以前不存在,如何创建带有超链接的选项卡?
- php - 清理输入数据是否可以防止 sql 注入?
- javascript - Plotly.js - 多条轨迹的悬停标签与 xaxis 悬停标签重叠
- python - 如何从合并的pdf文件中提取文本?
- sql - SQL - 截断(Oracle)日期 - 什么是未来的安全选项?