我正在开发一个基于移动HTML的应用程序,该应用程序使用WebSQL来存储用户数据。作为WebSQL,数据库本地存储在移动设备上的客户端上。该应用程序用于离线环境。
我需要添加一个导出数据的函数,以便当应用程序稍后有互联网连接时,可以将其作为.sql文件发送回服务器。
这是我第一次使用WebSQL,我正在尝试做类似于mysqldump的事情。这可能吗?或者有没有办法用WebSQL模仿这个功能?
答案 0 :(得分:1)
我上个月在博客上发表了这篇文章(http://www.raymondcamden.com/index.cfm/2014/2/24/Creating-a-data-backup-of-a-WebSQL-database),但由于对仅仅分享解决方案感到不满,我会在这里发布一些代码。 ;)基本前提是:
你浏览每张桌子。 你选择*。 您获取数据行,然后将它们转换为字符串。
这是我用来获取数据的代码。
function backup(table) {
var def = new $.Deferred();
db.readTransaction(function(tx) {
tx.executeSql("select * from "+table, [], function(tx,results) {
var data = convertResults(results);
console.dir(data);
def.resolve(data);
});
}, dbError);
return def;
}
$(document).on("click", "#doBackupBtn", function(e) {
e.preventDefault();
console.log("Begin backup process");
$.when(
backup("notes"),
backup("log")
).then(function(notes, log) {
console.log("All done");
//Convert to JSON
var data = {notes:notes, log:log};
var serializedData = JSON.stringify(data);
console.log(serializedData);
});
});
最后两行是你要调整的。对我来说,我想要JSON,所以我使用了原生的JSON序列化。如果您想要SQL,则需要遍历数据行并生成INSERT语句。你可能最好在服务器端这样做。
我忘了包含这个实用程序。它只是将SQLResultSet对象转换为更容易的数组。
//Generic utility
function convertResults(resultset) {
var results = [];
for(var i=0,len=resultset.rows.length;i<len;i++) {
var row = resultset.rows.item(i);
var result = {};
for(var key in row) {
result[key] = row[key];
}
results.push(result);
}
return results;
}
答案 1 :(得分:1)
几年前我有一个部分解决方案,现在我把它打包成一个独立的库。
随意下载websqldump.js
:
https://github.com/sdesalas/websqldump
有一些选项,但应该能够导出您的数据库并将其发布到远程服务器,如下所示:
// Export database and POST to remote server
websqldump.export({
database: 'NorthwindLite',
success: function(sql) {
$.ajax({type: 'POST', url: 'http://myserver.com/sync', data: sql});
}
});
希望这有帮助!