株式会社ライブキャストロゴ 株式会社ライブキャスト

flashcast:フリーで働くITエンジニア集団のブログ: iPhone OS 3.0のSafariでGPS機能を使ったWeb Applicationを作る!(sqlite保存編)の続きです。

前回は表示されている住所の吹き出しの中に、「save」リンクを設け、その住所をSQLiteに保存するようにしましたので、その住所を見るための履歴画面を作ります。

htmlの見た目は極めて単純なものにします。この時点ではかっこよさとかは気にしません。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=320px, user-scalable=no" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<title>iPhone GPS Sample</title>
</head>
<body>
<div id="header">
<div id="title">Histories</div>
<a href="../sqlite/">back</a>
</div>
<div id="main"></div>
</body>
</html>


データを検索して、1件以上あれば、画面上に表示します。

 function initialize() {
  try {
   db.transaction(
    function(transaction) {
     transaction.executeSql("SELECT dat FROM location ORDER BY id DESC", [],
      setLocations,
      function(error) {
       alert("initialize:" + error.message);
      }
     );
    },
    function(error) {
     alert("initialize:" + error.message);
    }
   );
  }
  catch (error) {
   alert("initialize:" + error.message);
  }
 }

 function setLocations(transaction, resultSet) {
  var html = "";

  for (i = 0; i < resultSet.rows.length; i++) {
   var address = tonosamart.evalJson(resultSet.rows.item(i).dat);

   if (address) {
    html += "<div><p>" + address.Placemark[0].address + "</p></div>";
   }
  }

  $("#main").html(html);
 }

あれ?うまくいきません。
よく見ると、JSONからオブジェクトに変換するところの正規表現でエラーになってます。

var address = tonosamart.evalJson(resultSet.rows.item(i).dat);

JSONの最後の部分に、ナゾのフィールドがあります。

“__shared”:undefined}”

これが正規表現に引っかかってました。何に使うんでしょう・・・
ナゾですが、値が入ってきた時のことも考慮して、SQLiteに保存する前に、

   if (address.__shared == undefined) {
    address.__shared = "";
   }

このような処理を入れることにしました。
やっと、うまくいきました。画面はこんな感じす。

次に、地図の画面から履歴画面に遷移できるようにします。
Google Mapsのカスタムマップコントロールを使います。
コントロール – Google Maps API – Google Code

履歴画面にリンクするだけのものなので、単純なものにします。

 function LocationControl() {
 }

 LocationControl.prototype = new GControl();

 LocationControl.prototype.initialize = function(map) {
  var container = document.createElement("div");
  var control = document.createElement("a");
  control.href = "../history/";
  this.setButtonStyle_(control);
  container.appendChild(control);
  control.appendChild(document.createTextNode("histories"));

  map.getContainer().appendChild(container);
  return container;
 };

 LocationControl.prototype.getDefaultPosition = function() {
  return new GControlPosition(G_ANCHOR_TOP_LEFT , new GSize(5, 5));
 };

 LocationControl.prototype.setButtonStyle_ = function(button) {
  button.style.color = "#000000";
  button.style.backgroundColor = "#FFFFFF";
  button.style.cursor = "pointer";
 };

画面はこんな感じです。

ここまでで、こんなのができました。もし良かったら、試してみてください!
iPhone GPS Sample