サンプルプログラムの機能
サンプルプログラム(図1)は上部に「バッチ更新」ボタンをもち、その下にデータを表示するデータグリッドがあります。データの編集をした後で「バッチ更新」ボタンをクリックするとデータの変更はデータベースサーバーに一括して送信されデータは更新されます。
プログラムを起動したときに最初にデータを表示する処理は、ActivityのonCreateメソッドに記述されています。
データベースへの接続
データベースへの接続処理をしているのは、次のコードです。
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1/northwind;http://10.0.2.2/droiddb/servlet/jdbchttp", "user", "password");
JDBC for AndroidはWebサーバーを経由してデータベースにアクセスするため、2つの接続情報を必要とします。他のJDBCは1つしかないため、APIの互換性を維持するために、1つの接続文字列に、2つの接続情報を詰め込んでいます。見れば分かると思いますが文字列「http」以降が、WebサーバーのURLです。ここにはdroiddbサーブレットがインストールされたURLを指定します。つまりAndroidクライアントは、この最初の引数の後半部の接続文字列に従ってWebサーバーに接続します。10.0.2.2というIPアドレスは前回説明したようにAndroidのエミュレータが動作するコンピュータと同じコンピュータを示しています。
最初の引数の前半部は、サーブレットがデータベースサーバーに接続するための文字列です。プログラムを見れば分かりますが前半部と後半部を分別するためのセパレータは「;http://」です。この例に基づいてデータベース名に続いて、サーブレットのURLを指定します。
データベースサーバーのIPアドレスである127.0.0.1は、データベースサーバーがWebサーバーと同じコンピュータであることを意味しています。つまり、最初の引数に指定されたこの2つの接続文字列は、AndroidエミュレータとWebサーバーとデータベースサーバーが同じコンピュータで稼働していることを意味しています。
2番目、3番目の引数はデータベースサーバーにアクセスするためのユーザーIDとパスワードです。
標準JDBCの実装ではgetConnectionメソッドは別の形の引数もサポートしますがJDBC for Androidでは、これら3つの引数が必須です。今のところ、それ以外のオーバーライドされたメソッドはないので、この記述方法を守ってください。このような例はこれだけではありません。だから、このサンプルに書かれたJDBCプログラミングスタイルに従ってプログラミングしてください。
前回も書いたように、JDBC for Android用に書かれたプログラムを他のJDBCドライバでも動くようにしたいですが、他のJDBCドライバ用に書かれたプログラムがJDBC for Androidで同じように動くことは期待しないでください。
バッチ更新の設定
次のコードではConnectionオブジェクトのsetAutoCommitメソッドの引数にfalseを設定して、バッチ更新を設定しています。
conn.setAutoCommit(false);
バッチ更新ではcommitメソッドが呼び出されたときにResultSetオブジェクトの内容の変更を、一括してデータベースサーバーに送信します。スマートフォンのAndroid端末などで、比較的遅い回線をつかってサーバーにアクセスするときには自動コミットよりもバッチ更新の方が使い勝手がよいでしょう。
JDBC for AndroidではsetAutoCommitメソッドの引数にtrueを設定して自動更新を使用することもできますが、今のところDBGrid for Androidとの組み合わせでデータの新規追加を行ったときの挙動が、やや不安定です。
とりあえずDBGrid for Androidを使うときはバッチ更新専用で使ってください。
SELECT文の実行
リスト1の以下のコードではSQLのSELECT文を実行しています。
rSet = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE)
.executeQuery("SELECT CustomerID,CompanyName,ContactName,Address1 FROM Customers");
ConnectionオブジェクトのcreateStatementメソッドの引数にResultSetクラスの定数を指定していますが、JDBC for Androidで実行する場合に、これらはあくまでダミーです。通常のJDBCドライバ接続をするときの互換性のために記述しているだけです。
これでデータベースサーバーから取得したデータをResultSetオブジェクトら格納することができました。
DBGrid for Androidの利用
ResultSetオブジェクトの内容をデータグリッドに連結表示しているのは、以下の3行です。
dBGrid = new DBGrid(this); dBGrid.ColumnTitleList = "ID,取引先名,担当者,住所"; dBGrid.CreateGrid(rSet);
2行目では列の見出しを設定しています。カンマで区切ってここで指定した文字列が列の見出しとして表示されます。
3行目のCreateGridメソッドの引数に結果セットを含むResultSetオブジェクトを指定すれば、データ連結されたデータグリッドが表示されます。
データの更新
データを変更した場合「バッチ更新」ボタンをクリックしてデータベースサーバーに反映させます。その処理を記述してあるのは、ボタンをクリックしたときに呼び出されるonClickメソッドです。
dBGrid.update(); conn.commit();
最初のupdateメソッドは現在編集中のセルの内容を変更に反映させるために実行します。
DBグリッドを左右上下にスクロール可能にする
DBGrid foe AndroidはTableLayoutクラスの派生クラスとして実装しています。だからLayoutクラスの子レイアウトとして画面に配置します。
次のコードではLinearLayoutクラスの子レイアウトであるHorizontalScrollViewクラスの子レイアウトであるscrollViewクラスの子レイアウトとして画面に配置しています。
linearLayout.addView(cmdButton); HorizontalScrollView hScrollView = new HorizontalScrollView(this); ScrollView scrollView = new ScrollView(this); hScrollView.addView(dBGrid); scrollView.addView(hScrollView); linearLayout.addView(scrollView);
これによりデータグリッドを左右上下にスクロールすることができます。小さい画面でデータを表示する場合には有効でしょう。
ベンダーが提供するJDBCドライバを利用する場合
このプログラムを通常のJDBCドライバを使ってデータベースサーバーに接続するには、リマークしてあるJDBCドライバのimport部と、やはりリマークされている次のコードのリマークを外せばよいです。
Class.forName("com.mysql.jdbc.Driver");
もちろんJDBCドライバの種類によって引数は変更しなければいけません。
Android 2.1では、このリマークを外したままでもJDBC for Androidを使えましたがAndroid 1.5ではリマークする必要があるようです。
あとは前回、説明したようにJDBCドライバをJavaのビルドパスに外部JARとして追加します。
DBGrid for AndroidはどのJDBCでも動作するはずですが、私たちはこの検証を行っていません。Microsoft SQL Server 2000で簡単に試したところ、データの表示はできましたが、データの編集はできませんでした。
このあたりの互換性維持の問題はおいおい解決していきたいと思います。とりあえずデータベースベンダーが提供するJDBCドライバは、ベンダーがAndroidで動作確認するまでは使用するべきでないと私は考えているので、それが解決するまでに対応すればいいと考えています。今の時点で大事なのはクラスのメソッドの互換性です。つまりJDBCのプログラミングスタイルで記述されたアプリケーシヨンがJDBC for Androidで動くことです。
