2009-11-25 72 views
1

而不是在JSON文件上執行包含SQL統計列表並每次傳遞一個SQL語句的列表的每個循環,Safari客戶端存儲可以簡單地將數據包裝在「 BEGIN TRANSACTION「/」COMMIT TRANSACTION「,並在一次調用中將其傳遞給數據庫系統?循環1,000+條語句需要太多時間。交易是否可以在Safari中使用HTML5存儲

目前在時間迭代一個交易:

 
$j.getJSON("update1.json", 
    function(data){ 
    $j.each(data, function(i,item){ 
      testDB.transaction(
       function (transaction) { 
        transaction.executeSql(data[i], [], nullDataHandler, errorHandler); 
       } 
      ); 
    }); 
}); 

試圖找出如何使只需一個電話:

 
$j.getJSON("update1.json", 
    function(data){ 
      testDB.transaction(
       function (transaction) { 
        transaction.executeSql(data, [], nullDataHandler, errorHandler); 
       } 
      ); 
}); 

有沒有人試過這又和成功?

+0

感謝您輸入的每一個人! – SKFox 2009-11-29 21:54:12

回答

1

我可以在文檔中找到的每個示例似乎都只顯示一個SQL語句,每個executeSql命令。我只是建議顯示一個「ajax spinner」加載圖形並在循環中執行你的SQL。你可以把它所有的事務中,但循環將仍然需要在那裏:

$j.getJSON("update1.json", 
    function(data){ 
     testDB.transaction(
      function (transaction) { 
       for(var i = 0; i < data.length; i++){ 
        transaction.executeSql(data[i], [], nullDataHandler, errorHandler); 
       } 
      } 
     ); 
    } 
); 

移動事務內部循環,並使用for i =應該爭取更多一點的速度你的循環。 $.each適合少於1000次迭代,之後本地for(var = i...可能會更快。

注意使用我的代碼,如果任何SQL語句拋出錯誤,整個事務將失敗。如果這不是你的意圖,你將需要保持循環以外的交易。

+0

更正您的記事。 executeSql支持爲錯誤提供回調,在你的例子中它是errorHandler。如果此處理程序返回true,則事務將失敗,如果爲false,它將繼續(或可能是相反的方式)。 – Michael 2010-08-09 10:18:38

0

我從來沒有與HTML5數據庫存儲(儘管與本地/ sessionStorage雖然)搞砸了,我會假設有可能運行一個巨大的語句字符串。使用data.join(separator here)獲取data數組的字符串表示形式。

+0

謝謝你的回答。看起來,即使與';'分開,它一次也不會接受更多的陳述。 – SKFox 2009-11-25 23:48:36

+0

這是一個小數據庫,用於簡單的操作。如果您想要一個完整的數據庫將數據發送到服務器。如果你想離線操作,在一個單線程的JavaScript應用程序,然後內置數據庫工作正常。 – 2009-11-26 00:53:07

0

是的,可以使用webSQL在單個事務中處理整個語句組。實際上,您甚至不需要使用BEGIN或COMMIT,只要您從同一個事務中完成所有executeSql調用,就會自動爲您處理。只要你這樣做,每一條陳述都會包含在交易中。

這使得這個過程更快,並且使得當你的一個語句有錯誤時它會回滾整個事務。

相關問題