我刚读了一些关于HTML 5 Web SQL数据库的内容.我在这里和谷歌进行了一些搜索,但找不到一个简单的答案.
有人能告诉我,使用它时存储的数据在哪里?在内存或文本文件或其他东西?
什么浏览器支持这个?
我有一个基于Web的Android应用程序,它使用WebSQL进行存储.出于某种原因,openDatabase在一个点上调用(响应按钮单击)会导致DOMException带有消息"SECURITY_ERR: DOM Exception 18".
请注意,我没有使用PhoneGap.
我在这里问的主要问题是:DOMException 18的可能原因是什么openDatabase?
更多细节:仅当数据库尚不存在时才会发生此异常.如果它已经存在,它按预期工作.进行openDatabase调用的函数在应用程序的另一部分中使用,并且运行正常.
到目前为止我尝试过的:
编辑: 这是命令的样子:
db = openDatabase('my_database', '1.0', 'My database description', 5*1024*1024, function() {});
Run Code Online (Sandbox Code Playgroud) 使用Cordova版本3.x和Android版本2.x到4.x.
我想知道:
window.sqlite.openDatabase()函数包装器是window.openDatabase()什么?最近,我遇到了浏览器提供的Web SQL和IndexedDB。我想了解可以使用的用例。
是否存在跨浏览器的jquery,就像可用的各种Web存储系统上的包装器API抽象一样?
我想我有一个相对简单的问题,但我一直在思考,甚至谷歌也没有给我一个我可以使用的答案.
基本上我试图复制一些使用WebSQL本地存储的记录.复制不是问题,但我需要知道在我的程序可以继续之前所有复制操作何时完成.
WebSQL调用是异步的,所以我通常做这些事情的唯一方法就是使用回调函数.但是,因为查询是在for循环中完成的,所以我不能使用回调函数,因为它将在第一个完成的查询中触发,如代码中所示.
代码如下:
function copyRecords(old_parent_id, new_parent_id, callback){
var db = openDatabase('test', '1.0', 'test', 50 * 1024 * 1024);
db.transaction(function (tx) {
tx.executeSql('SELECT * FROM table WHERE parent_id = ?', [old_parent_id], function(tx, results){
for(var i = 0; i < results.rows.length; i++){
db.transaction(function (tx2) {
tx2.executeSql('INSERT INTO table (name, parent_id) VALUES (?, ?)', [results.rows.item(i).name, new_parent_id], callback);
})
}
});
});
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过调用回调函数i == results.rows.length,但这并不能确保所有查询都完成.
我猜你们之前有些人遇到过同样的问题,所以任何有关如何解决这个问题的帮助,并确保只在for循环完成时才调用回调函数,我们非常感激.
先感谢您.
考虑:
var globalvar;
function viewyearmain() {
db.transaction(function (tx)
{
tx.executeSql('SELECT * FROM BUDGET WHERE holdingtype="month"', [], function (tx, results)
{
var len = results.rows.length;
msg = len;
globalvar = msg;
}, null);
});
if (globalvar>0)
{
alert("ROWS FOUND");
}
else
{
alert("ROWS NOT FOUND");
}
}
Run Code Online (Sandbox Code Playgroud)
ROWS NOT FOUND出现的问题是因为if到达语句时事务尚未完成.
WebSQL和IndexedDB都是用于访问(CRUD)Web浏览器中底层嵌入式数据库的DB API.其中,如果我是正确的,就像SQL一样访问(CRUD)任何客户端 - 服务器数据库,如Oracle等(在许多情况下,WebSQL和IndexedDB的支持在同一浏览器上可用)
而且由于WebSQL和IndexedDB都是API,所以它意味着说WebSQL和IndexedDB的性能并不完全正确(因为它们更像是查询/访问语言),但它在很大程度上取决于底层嵌入式数据库的性能.而且,根据Google的说法,LevelDB比SQLite更快
有没有办法在单个事务中执行多个语句?我想做的事情如下:
db.transaction(function (tx) {
tx.executeSql(
"CREATE TABLE Foo(ID INTEGER); CREATE TABLE Bar(ID INTEGER)",
function (tx, result) {
alert("success!");
});
});
Run Code Online (Sandbox Code Playgroud)
但相反,我发现我必须做这样的事情:
db.transaction(function (tx) {
tx.executeSql("CREATE TABLE Foo(ID INTEGER)");
tx.executeSql("CREATE TABLE Bar(ID INTEGER)",
function (tx, result) {
alert("success!");
});
});
Run Code Online (Sandbox Code Playgroud)
我是否仅限于在自己的事务中执行单个语句,然后在最后一个事务中触发successFn,或者有没有办法在单个事务中执行多个语句?
假设我想覆盖所有平台(Web、Electron 和 Cordova),离线存储数据最安全的方式是什么。
我问的原因是,我的应用程序 Fudget(它是 Cordova / Electron - 但不是 Quasar)使用 WebSQL 在本地存储用户的应用程序数据。这种方法多年来一直运行良好(我偶尔有一个 Android 用户,其数据会被 Android 操作系统擦除 - 但并不经常)。
但在过去的几天里,数百名 Android 用户的 WebSQL(和本地存储)被删除(有人知道为什么吗?),所以我收到了很多来自那些丢失了所有数据的人发来的愤怒电子邮件,设置。
我目前正在开发《Fudget 2》(使用 Quasar),并希望确保这种情况不会再次发生。我想要覆盖所有平台(Web、Mac、Windows、iOS、Android),并且想要将数据存储在本地 JavaScript 对象中,那么对于所有这些平台来说,在本地存储这些数据的最安全方法是什么?
显然,本地存储和 WebSQL(无论如何现在已被弃用)似乎并不安全。但是,例如,我可以安全地使用 IndexedDB 吗?这会永远持续下去吗?
或者我是否需要为每个平台集成一些适当的本机数据存储(例如,使用Cordova 的cordova-plugin-nativestorage 插件,以及 Electron 的类似插件)?如果是这种情况,我该如何处理 Web 平台呢?
persistent-storage local-database web-sql indexeddb quasar-framework
web-sql ×10
indexeddb ×4
javascript ×3
sqlite ×3
android ×2
html5 ×2
asynchronous ×1
browser ×1
cordova ×1
for-loop ×1
leveldb ×1
opendatabase ×1
synchronous ×1
web-storage ×1