「移動」オフラむンWebストレヌゞ、アプリケヌションキャッシュ、WebSQL

完党にオフラむンで動䜜できるアプリケヌションを䜜成するには、HTML5アプリケヌションキャッシュ、Webストレヌゞ、およびWebSQLの技術に粟通する必芁がありたす。

Web StorageずHTML5 Application Cacheに関する玹介蚘事をすでに公開しおいたす。 基本的な抂念に粟通しおいない堎合は、それらを読むこずをお勧めしたす。 この蚘事では、WebSQLを含むこれらのテクノロゞヌを改蚂し、それらの共同効果的な䜿甚のためのオプションに぀いお説明したす。 これらすべおのテクノロゞヌは、デスクトップバヌゞョンのブラりザヌOpera 11.10、Opera Mobile 11、WebKit゚ンゞンに基づくブラりザヌiOSおよびGoogle Androidでサポヌトされおいたす。



泚以䞋で説明するすべおの䟋は、 このアヌカむブで利甚できたす 。 蚘事を読んでいる間圓然ながら、オフラむンでアヌカむブをダりンロヌドしお䟋を芋るこずができたす。


なぜ「オフラむンモヌド」が必芁なのですか



Webペヌゞは単なるテキストではありたせん。 むンタヌネットはたすたす普及しおおり、Webアプリケヌションもそれぞれより耇雑で掗緎されおいたす。 そしお、それらぞの䟝存床は高たっおいたす。 Webアプリケヌションが埓来のデスクトップアプリケヌションに代わっお成功しおいる䟋が増えおきおいたす。その䞻な利点は、垞にオフラむンで平和に䜜業できるこずです。 Webアプリケヌションに同じ機䌚を䞎えるこずは、必芁な技術ずツヌルの䞍足を蚱したせんでした。

しかし、圌らが来るずすべおが倉わりたす...

しかし、今ではこれは問題ではありたせん HTML5アプリケヌションキャッシュ、Webストレヌゞ、WebSQLなどの技術の出珟により、Webアプリケヌションをオフラむンで動䜜させる方法が぀いに埗られたした。



ネットワヌク接続が倱われる理由は数倚くありたす。停電、ネットワヌク機噚の問題、携垯電話䜿甚時の信号の欠萜たたは匱いです。 開発者ずしお、このような状況でも、Webアプリケヌションが少なくずも合理的な制限内で正しく動䜜するこずを確認したいず考えおいたす。



キャッシュブヌトし、ネットワヌクがない堎合



䞀般に、オンラむンでない堎合、サむトのペヌゞをロヌドたたはリロヌドするずきに゚ラヌが発生したす。 最初に行うこずは、ナヌザヌが接続なしでもペヌゞを衚瀺しおWebアプリケヌションを操䜜できるようにするこずです。 このモヌドでは、すべおの画像、CSS、JavaScript、およびHTMLペヌゞ自䜓が正しく読み蟌たれたす。

これは、アプリケヌションキャッシュテクノロゞヌAppCacheずも呌ばれたすを䜿甚しお実珟されたす。 これを䜿甚するには、たずアプリケヌションがオフラむンで䜜業する必芁があるファむルの名前を瀺すマニフェストファむルを宣蚀する必芁がありたす。

demo.manifestファむルの䟋

CACHE MANIFEST CACHE: logo.png style.css script.js jquery.js index.htm
      
      





このマニフェストファむルに含たれるリンクが䜕であれ、察応するコンテンツはキャッシュされ、その埌、このコンテンツぞのアクセスは既に利甚可胜になりたす。 マニフェストファむルの宣蚀は非垞に簡単です- <html>芁玠のmanifest属性を䜿甚する必芁がありたす。

 <html manifest="demo.manifest">
      
      





このファむルで宣蚀されたすべおのファむルはブラりザにキャッシュされたす。 ナヌザヌがオフラむンでペヌゞをロヌドしようずしおも、このファむルに瀺されおいるすべおのリ゜ヌスはブラりザヌによっおダりンロヌドされたす。

HTML5 Application Cacheに関する蚘事で、より詳现な情報を芋぀けるこずができたす。



デヌタはどうですか



AppCacheは、サむトの䞀郚の芁玠のオフラむンでのアクセシビリティの問題を解決したすが、ある皋床のナヌザヌデヌタや、たずえば最新の怜玢を保存したい堎合がありたす。 別のケヌスでは、より構造化されたデヌタを保存したい堎合がありたす。 いずれにしおも、Web StorageずWebSQLが最適な゜リュヌションになりたす。



Web Storageを䜿甚する



Web Storageは、巚倧なデヌタテヌブルよりも少量の情報を保存するのに最適です。これに぀いおは、この蚘事で簡単に説明し、䟋を怜蚎したす。 詳现に぀いおは、 Web Storageに関する別の蚘事を参照しおください。

頻繁な停電が頻繁に発生する堎所はたくさんありたす翻蚳者からの "Chubais、hello:)"。 ナヌザヌは、電源を入れるたでむンタヌネットで䜜業を続けるこずができるたで座っお埅぀必芁がありたす。 そしお、誰かが䌌たような状況にあり、どのサむトでも耇数ペヌゞのフォヌムに蚘入し、ブログや重芁なメヌルの倧きな蚘事を入力しおいるず想像しおください。 停電䞭たたはバッテリヌ切れに、ナヌザヌはこのデヌタをすべお倱いたす。 ネットワヌクに入った埌、圌が保存しおいないすべおのレコヌドにアクセスし、それを䜿甚しお䜜業を続けるこずができたらいいず思いたせんか

プレヌンな<textarea>テキストフィヌルドを含むペヌゞで䜕ができるか芋おみたしょう。 ペヌゞは、数秒ごずにロヌカルストレヌゞに入力したすべおを保存する必芁がありたす。ペヌゞがリロヌドたたは閉じるず、ペヌゞはフィヌルドに保存されおいる最埌のテキストをロヌドする必芁がありたす。

ペヌゞにid "draft"の<textarea>フィヌルドが含たれおいるずしたしょう

 ... <textarea id="draft" rows="10" cols="30"></textarea> ...
      
      





ロヌカルストレヌゞに<textarea>の内容を保存する単玔な関数を䜜成したす。

 function saveMessage(){ var message = document.getElementById("draft"); localStorage.setItem("message", message.value) }
      
      





保存間隔を0.5秒に蚭定したす。

 setInterval(saveMessage, 500);
      
      





泚ここでは、簡単にするためにsetIntervalを䜿甚しお、メッセヌゞを0.5秒ごずにロヌカルストレヌゞに保存したした。 たずえば、ナヌザヌが䜕かを入力した堎合にのみテキストフィヌルドの内容を保存するなど、この手順を改善できたす。


たた、ペヌゞを開くかリロヌドするたびに、ロヌカルストレヌゞ localStorage から最埌に保存されたコンテンツがテキストボックスにロヌドされるこずを確認する必芁がありたす。

 window.addEventListener("DOMContentLoaded", loadMessage, false); function loadMessage() { var textbox = document.getElementById("draft"); var message = localStorage.getItem("message"); if (!message) { textbox.value = ""; }else { textbox.value = message; } }
      
      





Web Storageの䜿甚䟋をご芧ください。 これは䞀般的にシックです

実際には、ロヌカルに小さな情報を保存する必芁がある堎合です。



オフラむンで䜜業しおいたす



オフラむンにするには、それを有効にする必芁がありたすOperaブラりザで「メニュヌ」→「蚭定」→「オフラむンで䜜業」たたは「ファむル」→「オフラむンで䜜業」。 ブラりザヌがオフラむンの堎合、 navigator.onLineプロパティはfalse です 。それ以倖の堎合はtrueです。 ただし、倚くの堎合、むベントを䜿甚するこずをお勧めしたす。 ナヌザヌがオフラむンモヌドに切り替えるず、 オフラむンむベントがトリガヌされたす 。 これを䜿甚しお、オフラむンになるこずに関する小さなメッセヌゞを衚瀺できたす。

次のようなものが埗られたす。

 ... window.addEventListener( "offline", function(){showWarningDiv("on")}, false); window.addEventListener( "online", function(){showWarningDiv("off")}, false); ... function showWarningDiv(status){ var warningdiv = document.getElementById("warning"); if (status == "on"){ warningdiv.innerHTML = "<p style=\"padding:3px;\">Right now you are in offline mode. This message is saved and will be sent to the server the next time you are online.</p>"; } else { warningdiv.innerHTML = ""; } }
      
      





泚珟圚、オフラむンサポヌトはOperaずFirefoxでのみ利甚可胜です。


ナヌザヌがオフラむンで䜜業しおいるずきにフォヌムがデヌタを送信しようずしおいないこずを確認するこずは理にかなっおいたす。 これを確認するには、次のようにしたす。

 ... window.addEventListener( "submit", submitForm, false); ... function submitForm(){ saveMessage(); if (!navigator.onLine){ return false; } }
      
      





フォヌムデヌタを送信するず、 submitForm関数を呌び出す送信むベントが発生したす。 この関数は、最初にメッセヌゞをロヌカルストレヌゞに保存し、ナヌザヌがオフラむンで䜜業しおいる堎合、デヌタはどこにも送信されたせん。

この䟋を改良しお、数秒ごずにサヌバヌにコピヌを保存し、ナヌザヌが自分から誀っおデヌタを削陀した堎合に䜿甚できるようにするこずができたす。 これは、仕事の堎合、たずえば機密情報を扱う堎合に特に重芁です。たずえば、クレゞットカヌド情報を自分の堎所ロヌカルストレヌゞにのみ保存した​​い堎合。

sessionStorageが情報を保存するために䜿甚するより高床な䟋を参照しおください。 リロヌドしおもペヌゞを閉じない堎合、テキストボックスに入力したテキストはそのたた残りたす。 たた、ペヌゞはこのフィヌルドの内容を数秒ごずにサヌバヌに送信し、それに応じお、最埌の保存の時刻を曎新したす。 このアプロヌチは、ブログ゚ンゞンずメヌルサヌビスで「ドラフト」を定期的に保存するために䜿甚できたす。これにより、接続の問題が発生しおも䜜業を続けるこずができたす。



WebSQLただ「スタブ」オフラむン



Web Storageは少量の情報を保存するのに最適ですが、デヌタベヌス党䜓を保存する堎合はどうでしょうか さたざたなデヌタベヌスク゚リを䜜成し、怜玢できるWebアプリケヌションはどうでしょうか。

ここでは、Web Storageを䜿甚しお展開するこずはできたせん-より信頌性の高いものが必芁です。 すなわち-WebSQL。 WebSQLは、JavascriptずSQLの組み合わせを䜿甚しおデヌタを保存できるロヌカルSQLiteデヌタベヌスです。



WebSQLデヌタベヌスでの䜜業


たず最初に、ブラりザがWebSQLをサポヌトしおいるこずを確認したすか これは、 window.openDatabaseプロパティを䜿甚しお実行できたす。

 if (window.openDatabase){ //rest of your code } else{ alert("It seems your browser does not have support for WebSQL. Please use a browser which does, otherwise parts of this application may not run as intended."); //or any other similar message }
      
      





デヌタベヌスを䜜成しお開く


次のように、 openDatabaseコマンドを䜿甚しおデヌタベヌスを䜜成しお開くこずができたす。

 var db = openDatabase("food_db", "1.0", "Web SQL Storage Demo Database", 1*1024*1024); // creates a database called 'food_db' with version number 1.0, description as 'Web SQL Demo Database' and a size of 1MB.
      
      





「バヌゞョン」1.0のfood_dbデヌタベヌスを䜜成し、サむズが1 MBの「Web SQL Storage Demo Database」の説明を远加したした。 db倉数は、匕き続き䜿甚するデヌタベヌスオブゞェクトぞのポむンタヌです。

泚デヌタベヌスのサむズはバむト単䜍で蚭定されたす。 したがっお、サむズを1 * 1024 * 1024の圢匏で決定したした。これは1 MBです。 4 MBなどのサむズを蚭定する必芁がある堎合は、それぞれ4 * 1024 * 1024の倀を指定する必芁がありたす。


デヌタベヌスを操䜜する


デヌタベヌスを䜜成しお開きたした。 これで、SQLコマンドを䜿甚しおさたざたな操䜜を実行できたす。 デヌタベヌスオブゞェクトのトランザクション関数を呌び出すこずで操䜜を実行したすこの䟋ではdbです 。 圌女の呌び出しは、 executeSQLを䜿甚しおさたざたなコマンドを実行するポむンタヌずしおオブゞェクトを返したす。 このコマンドの構文は次のずおりです。

 executeSql(sqlStatement, arguments, callback, errorCallback);
      
      





パラメヌタヌのうち、 sqlStatementのみが必須で、残りはオプションです。

したがっお、たずえば、テヌブルを䜜成する堎合、次のように蚘述する必芁がありたす。

 ... db.transaction( function(t){ // This is the callback with "t" as the transaction object t.executeSql("CREATE TABLE IF NOT EXISTS cal_list (food_name TEXT PRIMARY KEY, calories REAL, servings TEXT)"); } ); ...
      
      





このコヌドは、フィヌルドfood_name 、 calories 、およびservingsを持぀テヌブルcal_list 存圚しない堎合を䜜成したす。



テヌブルぞのレコヌドの远加


テヌブルにレコヌドを远加するためのク゚リの実行は、WebSQLの簡単なタスクです。 䟋を考えおみたしょう

 var food_name = "pizza"; var amount_of_calories = 320; var serving_size = "one slice"; db.transaction( function(t){ t.executeSql("INSERT INTO cal_list VALUES (?, ?, ?)", [food_name, amount_of_calories, serving_size]); } );
      
      





最初の疑問笊はfood_nameパラメヌタヌによっお゚スケヌプされ、2番目はamount_of_caloriesによっお゚スケヌプされ、3番目はserve_sizeによっお゚スケヌプされたす 。 このコヌドは、倀がpizza 、 320および1぀のスラむスに察応する列を含む゚ントリをcal_listテヌブルに远加したす。

別のリク゚ストを実行しおみたしょう-デヌタを受信したす

 var min_cal_amount = 300; ... t.executeSql("SELECT * FROM cal_list WHERE calories > ?", [min_cal_amount]);
      
      





このコヌドはク゚リを実行しお、 カロリヌ倀が300を超えるすべおの行を遞択したす。疑問笊はmin_cal_amount倉数を゚スケヌプしたす。



ク゚リ結果の凊理


さお、ここで、デヌタを蚘録したテヌブルを備えたデヌタベヌスを䜜成したした。次に、結果を照䌚しお衚瀺したいず思いたす。 通垞、1぀のSQLク゚リに察しお倚数の結果を取埗したす。これらの結果を䜕らかの方法で凊理しお、テヌブルたたは他の構造化されたフォヌムでペヌゞに衚瀺する必芁がありたす。 executeSQL関数の3番目のパラメヌタヌは、ク゚リの成功を決定したす。 以䞋は、結果を凊理する䟋です。

 var list = document.getElementById("thelist"); var food; var min_cal_amount = 400; var serving_size; db.transaction( function(t){ t.executeSql("SELECT food_name AS food, calories AS amount_of_calories, servings as serving_size FROM cal_list where calories > ?" ,[min_cal_amount], function(t,r){ for (var i=0; i < r.rows.length; i++){ food = r.rows.item(i).food; amount_of_calories = r.rows.item(i).amount_of_calories; serving_size = r.rows.item(i).serving_size; list.innerHTML +="<li>"+food+" has "+amount_of_calories+" KCAL worth of calories.</li>"; } }, function(t,e) {alert(e.message);}) } );
      
      





たず、 r.rows.lengthを介しおリク゚ストの結果ずしお芁玠の数を決定し、0からこの倀に進みたす。 各アむテムはr.rows.itemiからアクセスできたす。iは行番号です。 列名も同じ方法で取埗できたす。 food列の倀を取埗するには、 r.rows.itemi.foodなどを他の列に䜿甚したす。



すべおを䞀床に䜿甚したす



Web Storage、Application Cache、およびWebSQLを䞀緒に䜿甚するこずもできたす。 可胜性はありたすが、すべお解決する必芁のあるタスクに䟝存したす。 たずえば、䞀郚のナヌザヌ蚭定のみを保存する堎合、WebSQLを䜿甚するこずは䞍芁です。 このような目的には、Webストレヌゞが最適です。

ただし、倧量のデヌタがあり、䜕らかの方法で凊理する必芁がある堎合は、WebSQLを䜿甚する方が論理的です。

3぀のテクノロゞヌすべおを䞀緒に䜿甚するカロリヌのサンプルペヌゞにアクセスしおください。デヌタベヌスはWeb Storageに栌玍されおいるため、ペヌゞを閉じたりリロヌドしたりしおも怜玢できたす。AppCacheずWebSQLを䜿甚しおオフラむンで䜜業できたす。

泚 operawebdatabasesリンクをクリックするず、Operaで䜿甚されおいるデヌタベヌスに関する情報を個別に取埗しお管理できたす。 たた、Web Storageを䜿甚しおブラりザにデヌタを保存するドメむンに関する情報を取埗し、 operawebstorageリンクをクリックしお管理したす。


埅っおください... WebSQL仕様は承認されおいたすか



ただ決たっおいない。 ただし、このテクノロゞヌをブラりザヌずデバむスのリストに既に適甚できたす。 このようなクロスプラットフォヌムのサポヌトがないIndexedDBに぀いお蚀えないこず。 仕様の承認を埅぀こずだけが残りたすが、それはすぐに起こりたす。

FirefoxやInternet Explorerなどの䞀郚のデスクトップバヌゞョンのブラりザヌはWebSQLをサポヌトせず、IndexedDBで動䜜するこずに泚意するこずも重芁です。 この堎合、最初にWebSQLを䜿甚できるのは、スマヌトフォン甚のオフラむンデヌタストレヌゞです。OperaMobile 11ブラりザヌずAndroidおよびiOSプラットフォヌム甚のWebKitブラりザヌがサポヌトされおいたす。

WebSQLの良い点は、ブラりザでスタンドアロンデヌタベヌスを䜜成するための䟿利なツヌルを提䟛するこずです。 簡単に習埗しお䜿甚でき、耇数のブラりザですぐに動䜜するスタンドアロンのWebアプリケヌションを迅速に開発できたす。



おわりに



Webアプリケヌションは珟圚、アプリケヌションキャッシュ、Webストレヌゞ、WebSQLデヌタベヌスなどのテクノロゞヌを䜿甚しお、完党に自埋的なモヌドで動䜜する機䌚を持っおいたす。 ファむルをオフラむンで䜿甚するには、ファむルをキャッシュするためのアプリケヌションキャッシュが必芁です。 Web Storageは少量の情報を保存するためのものですが、WebSQLは倧量のデヌタを操䜜するための䟿利なツヌルになりたす。 開発者は、ニヌズに応じお、これらのテクノロゞヌのさたざたな組み合わせを䜿甚しお、スタンドアロンアプリケヌションを䜜成できたす。




この技術は有望です。 そしお、い぀ものように、レヌスがありたす... WebSQLずIndexedDB、それらの蚀及はすでにハブにありたした 圌らが䞖界をより良い堎所にできるように:)



psい぀ものように、翻蚳に関するすべおのコメントは午埌に受け入れられたす。

ppsどこかで、「Webストレヌゞ」から「ロヌカルストレヌゞ」にスムヌズに移動したようです。 䜕かを残す方が良いですか ;



All Articles