|
IT総合情報ポータル「ITmedia」 |
ITとビジネスのニュース専門サイト「ITmedia News」 |
企業のためのIT情報サイト「ITmedia エンタープライズ」 |
IT製品導入支援サイト「TechTargetジャパン」 |
経営者とCIOのコミュニティー「ITmedia エグゼクティブ」 |
PCとMacの専門サイト「ITmedia +D PC USER」 |
携帯、スマートフォンの専門サイト「ITmedia +D Mobile」 |
電子書籍の専門サイト「ITmedia eBook USER」 |
デジカメの専門サイト「ITmedia デジカメプラス」 |
AV機器の専門サイト「ITmedia +D LifeStyle」 |
旬なモノネタ「ITmedia ガジェット」 |
ニコ生、Ustreamの動画番組表「ライブガイド」 |
ビジネスブログ・メディア「ITmedia オルタナティブ・ブログ」 |
ちょっと気になるネットの話題「ねとらぼ」
ビジネスiアプリ入門(5)
|
| 初期登録 | 自分の名前を登録する |
| メンバーの状態表示 | メンバーの名前と状態を表示 |
| 状態・メッセージの受信 | メンバーの名前と状態、またはメッセージを受け取る |
| メッセージ送信 | 自分の名前と相手の名前でサーバに送る |
| 自分の状態変更 | 自分の名前と状態をサーバに送る |
これらより以下のようなデータ構造が見えてきます。
| 意味 | 数 | 持続期間 | 変更 |
| 自分の名前 | 1つ | ずっと保持する | なし |
| メンバー(名前と状態) | メンバーの数だけ | ずっと保持する | あり |
| メッセージ(名前とメッセージ) | メッセージの数だけ | 来たときに使用するのみ | − |
これをiアプリで使用できるようにJavaで記述します。上記のデータ構造で持続期間が永久であるものを、後述のデータの永続化のために、Dataクラスとしてひとまとめにすることにします。
static class Data { // ビジネスIMで使用するデータを保持するクラス
String myname = null;
Vector member = new Vector();
}
static class Member { // メンバー1人の情報を保持するクラス
String name;
String state;
}
class Message { // メッセージ1つを保持するクラス
String name;
String message;
}
Vector(java.util.Vector)は、追加や削除が可能な動的にサイズの変わる配列のように用いるデータ保持クラスです。
データの永続化
作成したデータ構造は、待ち受けiアプリ内で保持していたとしても、ほかのiアプリの起動などによりいったん終了すると消えてしまいます。そのため端末のスクラッチパッドに保存しておく(永続化する)必要があります。
永続化のためには、Connectorによってスクラッチパッドにアクセスするようにします。
// ------------------------------------------------------------------
// データの永続化
// ------------------------------------------------------------------
final int SP_DATA_POS = 0;
void writeData(Data data) {
try {
OutputStream os = Connector.openOutputStream("scratchpad:///0;pos=" + SP_DATA_POS);
writeString(os, data.myname);
os.write(data.member.size());
for (int i = 0; i < data.member.size(); i++) {
Member member = (Member)data.member.elementAt(i);
writeString(os, member.name);
writeString(os, member.state);
}
} catch (Exception e) {
}
}
Data readData() {
InputStream is = null;
try {
is = Connector.openInputStream("scratchpad:///0;pos=" + SP_DATA_POS);
Data data = new Data();
data.myname = readString(is);
if (data.myname == null)
return null;
int n = is.read();
for (int i = 0; i < n; i++) {
Member member = new Member(readString(is), readString(is));
data.member.addElement(member);
}
is.close();
return data;
} catch (Exception e) {
try {
if (is != null)
is.close();
} catch (Exception e2) {
}
}
return null; // エラー時にはnullを返す
}
readDataにおいて何もデータが書かれていない場合、nullを返し、初回登録させるようにしています。また、上記コードにある、文字列を入出力するメソッドwriteString/readStringは以下のような実装となります。
void writeString(OutputStream os, String s) throws Exception {
os.write(s.length());
os.write(s.getBytes());
}
String readString(InputStream is) throws Exception {
int len = is.read();
if (len == 0)
return null;
byte[] b = new byte[len];
int off = 0;
for (;;) {
int n = is.read(b, off, len);
if (n < 0)
return null;
off += n;
len -= n;
if (len == 0)
break;
}
return new String(b);
}
readString内のbyte配列の読み込みメソッド is.read は、指定した長さだけ読み込むことが保証されておらず、読み込んだ長さを返すため、このように少し長めのコードになってしまいます。
[福野泰介, ITmedia]
Copyright© 2012 ITmedia, Inc. All Rights Reserved.
前のページ | 1/4 | 次のページ
最新スペック搭載ゲームパソコン
高性能でゲームが快適なのは
ドスパラゲームパソコンガレリア!
最新CPU搭載パソコンはドスパラで!!
第3世代インテルCoreプロセッサー搭載PC ドスパラはスピード出荷でお届けします!!