ビジネス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 © ITmedia, Inc. All Rights Reserved.
前のページ | 1/4 | 次のページ
最新CPU搭載パソコンはドスパラで!!
第3世代インテルCoreプロセッサー搭載PC ドスパラはスピード出荷でお届けします!!
最新スペック搭載ゲームパソコン
高性能でゲームが快適なのは
ドスパラゲームパソコンガレリア!