flashcast:フリーで働くITエンジニア集団のブログ: iPhone OS 3.0のSafariでGPS機能を使ったWeb Applicationを作る!(iPhoneでテスト編)の続きです。
いままでのサンプルアプリは住所を表示するだけなので、もう一工夫して、その住所を保存できるようにしたいと思います。
保存先は、tonomemoと同じように組み込みデータベースのSQLiteにします。
まず、テーブル構造を考えます。
緯度と経度と・・・
ん。よく考えるとGoogle Maps APIの戻り値は、JSONオブジェクトなので、とのさまのflashcast:フリーで働くITエンジニア集団のブログ: ipod touch用のWeb Applicationを作成してみる(JSONについて)のアイデアが使えそうです。
JSONを、まんま1カラムにぶち込みます。
これは非常にいいアイデアです。
今までのサンプルでは、JSONオブジェクトの一部の情報しか使用していませんが、今後、機能拡張した場合にもテーブル設計を見直す必要はありません。また、Google Maps APIの仕様が変わっても、柔軟に対応できるはずです。
$(document).ready(function() { var isDbConnect = true; try { db = openDatabase('iPhone GPS Sample', '0.9', 'iPhone GPS Sample'); db.transaction( function(transaction) { transaction.executeSql('CREATE TABLE IF NOT EXISTS location (id INTEGER PRIMARY KEY, dat TEXT, locale TEXT)'); }, function(error){ isDbConnect = false; } ); } catch (error) { isDbConnect = false; } finally { $("body").attr("onload", initialize(isDbConnect)); } });
画面の方は、住所が表示されている吹き出しの中に、「save」リンクを作ります。
function showAddress(response, latlng, isDbConnect) { if (response != null && response.Status.code == 200) { map.clearOverlays(); place = response.Placemark[0]; marker = new GMarker(latlng); map.addOverlay(marker); marker.openInfoWindowHtml('<b>Address:<¥/b>' + place.address + ((isDbConnect) ? "<br ¥/><a href='javascript:saveLocation();'>save<¥/a>" : "")); address = response; } else { alert("Not found."); } }
ここでは、SQLiteが利用できないブラウザも考慮して、DB接続できない場合は「save」リンクを出さないようにしています。
「save」リンククリック時の処理は、以下のようになります。
function saveLocation() { try { db.transaction( function(transaction) { transaction.executeSql('INSERT INTO location(dat, locale) VALUES(?, ?)', [tonosamart.obj2Json(address), (new Date()).toLocaleString()]); }, function(error){ alert("saveLocation:" + error.message); }, function(){ map.clearOverlays(); alert("saveLocation complete!"); } ); } catch (error) { alert("saveLocation:" + error.message); } }
画面はこんな感じです。
これで、住所をメモる必要はなくなりました。
次は、保存した住所を見る仕組みを作りたいと思います!