如何处理增加Web存储的提示?

时间:2013-08-06 08:32:19

标签: html5 mobile web-sql web-storage

当您达到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();
        });
    });

1 个答案:

答案 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 );