2013-08-06 55 views
1

當您達到Web SQL商店的大小限制時,Mobile Safari(和Android瀏覽器)將提示您增加存儲大小。一旦發生這種情況,事務,onSuccess回調或onError回調都將被執行。我似乎也無法在這裏發現任何異常,那麼我該如何處理增加存儲的提示呢?如何處理增加Web存儲的提示?

所有的操作都是異步的,所以我只能想到設置超時並檢查事務在一段時間後是否完成。這當然是一個令人討厭的,錯誤纏身的黑客。除此之外,我必須重新進行交易才能真正檢查空間是否增加。

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

相關:http://stackoverflow.com/questions/15066203/websql-transaction-does-rollback-if-size-limit - 已到達 – oligofren

回答

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); 
+0

Thx男子!大量的幫助! – Ostkontentitan

+0

很高興聽到它幫助了某人,並感謝您的讚賞:) – oligofren