当您达到Web sql存储的大小限制时,Mobile Safari(和Android浏览器)将提示您增加存储大小。一旦发生这种情况,就不会执行事务,onSuccess回调或onError回调。我似乎也无法在这里发现任何异常,所以我应该如何处理增加存储的提示?
所有操作都是异步的,所以我只能考虑设置超时并检查事务是否在一段时间后完成。这当然是一个讨厌的,错误的黑客攻击。除此之外,我必须重新进行交易以实际检查空间是否增加。
Fiddle for verifying on mobile browser
// open the jsfiddle in safari
// refuse when prompted to increase space to show the bug
db.transaction(function (tx) {
tx.executeSql("INSERT INTO key_value(key, value) VALUES(?,?);", ["mykey", buildBigString(3*Math.pow(10,6))], function (tx, result) {
// will never be called
done();
}, function (tx, error) {
// will never be called
done();
});
});
答案 0 :(得分:1)
上面代码的问题基本上是我错过了包装sql插件的事务的错误回调。有关如何实际处理用户提示的详细信息,请参阅此elaborated blog post on the matter。
来自specification on the Asynchronous Database API
void transaction(in SQLTransactionCallback callback,
in optional SQLTransactionErrorCallback errorCallback,
in optional SQLVoidCallback successCallback);
没有示例代码显示这一点,因此我继续假设使用了transaction
方法而没有回调。
所以不要写
db.transaction(function (tx) {
// if this prompts the user to increase the size it will not execute the sql or run any of the callbacks
tx.executeSql('INSERT INTO foo (id, text) VALUES (1, createReallyBigString('4MB')', onComplete, onError );
});
这样做
// Note the reverse order of the callbacks!
db.transaction(function (tx) {
// this will prompt the user to increase the size and the sql will not be executed
tx.executeSql('INSERT INTO foo (id, text) VALUES (1, createReallyBigString('4MB')');
}, onError, onComplete );