詳細は入会方法をご覧下さい。※現在レビュー中です。内容は間違いを含んでいる可能性があります。WebAPIなどから取得したXMLを解析(パース)して、内容を取り出すアプローチは、大きく分けてDOMとSAXがあります。DOMはXMLをツリー上に展開し、自由に読み書きできるものの、比較的多くのメモリを消費します。SAXはXMLを先頭から読み込んで処理していくため、高速でメモリ消費も少ないのですが、複雑な構造のXMLを読み込む場合に制御が複雑になるのと、その性質上汎用的に作るのが難しいため、ケースバイケースで使い分けることになるかと思います。ver1.0に至るまでの過程でAPIが変化してしまったため、今では動かないコードも散見されます。ここでは、前のチュートリアルに引き続き、org.w3c.domパッケージ(?)を使ってXMLをパースしているRestfulClientクラスと、アプリケーションの設定値保持などに使用可能な、SQLiteを使った永続化機能付きのHashとしてのSettingsクラスを使って、Twitterクライアントを作ってみます。†Androidでorg.apache.http.clientを使用するの手順1に従い、GitHubから最新版ユーティリティのソースファイルをダウンロードし、Eclipseにセットアップします。RestfulClientクラスにBASIC認証機能を付けたので、先のチュートリアルを試した方も、再度ダウンロードし直してください。†Twitterクライアント用のプロジェクトを作成します。Poroject"を選択して、"Next"ボタンを押します。開いたダイアログで、以下のように入力してFinishボタンを押します。†このプロジェクトではインターネットにアクセスするため、パーミッションの使用を許可する必要があります。†このプロジェクトは2つのレイアウトファイルを使います。するのは、黒魔術のおまじないかもしれません。†Androidでorg.apache.http.clientを使用するの手順5に従い、net.it4myself.utilパッケージをビルドパスに加えます。※筆者はTwitterにあまり詳しくないので、用語など間違えていたらごめんなさい。日本語訳版を使って仕様を確認しましょう。Twitterユーザ全体のタイムラインである、パブリックタイムラインをXMLで取得するにはhttp://twitter.com/statuses/public_timeline.xmlからXMLを読む必要があります。パブリックタイムラインは、BASIC認証を使う必要はありません。自分がフォローしている友達だけのタイムラインである、フレンドタイムラインをXMLで取得するにはhttp://twitter.com/statuses/friends_timeline.xmlからXMLを読む必要があります。この際、BASIC認証を使って自分のTwitter用IDとパスワードを一緒に渡す必要があります。BASIC認証でID/パスワードを送信するため、httpよりは暗号化されたhttpsの方が好ましいかも知れません。RestfulClientクラス、TwitterAPIサーバ共にSSLに対応しているので、接続先スキーマをhttpsにするだけで使えます。先にブラウザを使ってどんなXMLが返ってくるのか確認しておくのが吉です。BASIC認証用にRestfulClientクラスを改良しておいたので、確認してみてください。PASSWORD";でTwitterのID/パスワードを設定できます。"";とするとBASIC認証は使わなくなります。設定したタイミングでSQLiteに格納するので、途中でアプリケーションが終了しても、値は保持されます。これらを利用して、入力されたID/パスワードを保存しておき、次回起動時に復元させる。mFactory.newDocumentBuilder());として、Documentとして結果を取得するRestfulClient.RemoveEmptyNodes(result.getDocumentElement());を使って、改行だけのテキストノードを削除する。(削除しなくても構いませんが、削除した方が理解しやすいと思います)Node.getChildNodes();で、現在のノードの子ノードリストを取得し、ループにかけるNode.getNodeName();で欲しいタグ名を探す欲しいタグを見つけたらNode.getFirstChild().getNodeValue();でテキストを取得する。getFirstChild()を入れるのは、テキストは現在のノードの子ノード(テキストノード)に格納されているため。これらを利用し、Twitterでの発言内容とユーザ名を取得し、ListViewを使って表示する。ver1.0時点ではorg.w3c.domパッケージ(?)はバグが多いらしく、一部オプションが動いてくれなかったため、空テキストノード削除用にRemoveEmptyNodes()も用意しました。DOMオブジェクトを扱いたい場合はお使いください。実際にコーディングしてみます。†android_utilsプロジェクトのsrcの下のnet.it4myself.util.Settings.javaを開いて、流れを追ってみましょう。DatabaseHelperクラスを追って、ヘルパークラスを理解するSQLiteOpenHelperクラスを継承したDatabaseHelperクラスを定義しています。SQLiteOpenHelperクラスは、データベースの作成・テーブルの作成・初期データ等のインサート・バージョン管理・読み書き用インスタンスの管理など、SQLiteを扱う上で便利な機能をまとめたヘルパークラスとなっています。このクラスを継承して個々のアプリケーションの設定を施します。初期データとしてseedという名前で、タイムスタンプを元にしたユニークな値を入れています。これはユーザ名などと掛け合わせて、同一クライアントからのアクセスであることを保証するためのシードとして使うために用意したものです。用途に合わなければ削除しても構いません。setメソッドとgetメソッドは、一般的なセッター/ゲッターとして動作しますが、set時には値をSQLiteにも書き込んでいます。よって、どのタイミングでも設定値を保持できています。hasKeyInDB()を追って、SELECT時の動作を確認するユーザの入力値に由来する値をSQLに含めるときは、SQLインジェクション対策などのため、SQLiteQueryBuilderクラスを使ってSQLを構築する方法が推奨されています。SQLに使いたいパラメータをselectionArgsにまとめます。データベースファイルを壊さないように、SELECT時にはmOpenHelper.getReadableDatabase()を使って、読み取り用のデータベースインスタンスを取得します。qb.query()を実行すると、結果がCursor型で返ってくるので、cursor.moveToNext()などを使って各行を取得します。restore()メソッドあたりを参考にしてください。insertToDB()を追って、INSERT時の動作を確認するINSERT文に含める名前と値は、あらかじめContentValuesのインスタンスに登録しておきます。SQLインジェクション対策などのためです。INSERTなど、データベースに書き込みを行うときは、mOpenHelper.getWritableDatabase()を使って書き込み用のデータベースインスタンスを取得しておきます。裏でロック処理などを行っているようです。db.insert()を行うとINSERT文が実行され、追加された行数が返ります。updateDB()とdelete()を追って、それぞれの動作を確認する基本的な考えはINSERT時と同じです。{key})のように、WHERE句のためのパラメーターは"?"を使ってバインドさせます。この例では?はkeyの内容に置き換わります。†このチュートリアルではタイムラインの取得と表示だけを扱っていますが、RestfulClientを使えば投稿も簡単にできます。投稿できるように改造してみましょう!既にお気づきかも知れませんが、パブリックタイムラインでは日本語を表示できるものの、フレンドタイムラインでは日本語が消えてしまいます。キャラクタセット(UTF8)の取り扱いがどこかでおかしくなっているのですが、Twitter側の問題なのかコード側の問題なのかわかりませんでした。