au、ソフトバンクのアプリ作成講座、今回は端末にデータを保存する方法です。
前回のプログラムを少し変更して、メモした内容を保存するサンプルを作ってみました
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.ItemCommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.StringItem;
import javax.microedition.lcdui.TextField;
import javax.microedition.lcdui.Spacer;
import javax.microedition.midlet.MIDlet;
import javax.microedition.rms.*;
public class Midp07 extends MIDlet {
public Midp07(){
//フォーム生成
Midp07Form mainForm = new Midp07Form();
//カレントフレームにフォームを設定
Display.getDisplay(this).setCurrent(mainForm);
}
protected void startApp() {
}
protected void pauseApp() {
}
protected void destroyApp(boolean unconditional) {
}
}
class Midp07Form extends Form implements ItemCommandListener{
StringItem clearButton;
StringItem readButton;
StringItem writeButton;
TextField inputTextBox;
RecordStore record = null;
/** コンストラクタ **/
Midp07Form(){
super("メモ帳");
//入力テキスト
append(new Spacer(240,5));
inputTextBox = new TextField("入力内容", "", 200, TextField.ANY);
inputTextBox.setInitialInputMode("UCB_HIRAGANA");
append(inputTextBox);
//クリアボタン
append(new Spacer(240,5));
clearButton = new StringItem("クリア","",Item.BUTTON);
clearButton.setLayout(Item.LAYOUT_CENTER);
clearButton.setDefaultCommand(new Command("",Command.SCREEN,0));
clearButton.setItemCommandListener(this);
append(clearButton);
//読込ボタン
append(new Spacer(240,5));
readButton = new StringItem("読込","",Item.BUTTON);
readButton.setLayout(Item.LAYOUT_CENTER);
readButton.setDefaultCommand(new Command("",Command.SCREEN,0));
readButton.setItemCommandListener(this);
append(readButton);
//保存ボタン
append(new Spacer(240,5));
writeButton = new StringItem("保存","",Item.BUTTON);
writeButton.setLayout(Item.LAYOUT_CENTER);
writeButton.setDefaultCommand(new Command("",Command.SCREEN,0));
writeButton.setItemCommandListener(this);
append(writeButton);
}
public void commandAction(Command cmd,Item item){
if (item==clearButton) {
//テキストクリア
System.out.println("テキストクリアしました。");
inputTextBox.setString("");
}else if(item==readButton){
//データ読込
String memo = "";
try{
//レコードストアの接続
record = RecordStore.openRecordStore("memo",false);
//レコードストアを読込
byte[] b = record.getRecord(1);
memo = new String(b);
inputTextBox.setString(memo);
//レコードストアの切断
record.closeRecordStore();
}catch(RecordStoreException e){
e.printStackTrace();
}
}else if(item==writeButton){
//データ書込
try{
//レコードストアの接続
record = RecordStore.openRecordStore("memo",true);
//レコードの追加
String data = inputTextBox.getString();
byte[] b = data.getBytes();
if (record.getNumRecords()==0) {
record.addRecord(b,0,b.length);
}else{
record.setRecord(1,b,0,b.length);
}
//レコードの切断
record.closeRecordStore();
}catch(RecordStoreException e){
e.printStackTrace();
}
}
}
}
概要
前回からボタンを2つ追加しています。
1.書込
2.読込
機能としてはテキストフィールドにテキストを入力して、書込ボタンでデータを保存します。
そして読込ボタンで保存しておいたデータを読込ボタンを押してテキストフィールドに反映させます。
プログラムの解説
MIDPではレコードストアという端末の領域にデータを保存します。
利用にあたり、以下のクラスをインポートします。
import javax.microedition.rms.*;
利用する手順は、接続→保存→切断となります。
保存する領域はレコードIDで管理されており、名前を好みで設定できます。
この辺りはDojaのスクラッチパッドとは大きく違うところです。
では、実際のソースを追って利用する手順を具体的に説明します。
//レコードストアの接続
record = RecordStore.openRecordStore("memo",true);
まず、接続の部分から。
RecordStore.openRecordStoreで接続を行います。
ここで指定した”memo”がレコードIDになります。
//レコードの追加
String data = inputTextBox.getString();
byte[] b = data.getBytes();
if (record.getNumRecords()==0) {
record.addRecord(b,0,b.length);
}else{
record.setRecord(1,b,0,b.length);
}
次にレコードを保存します。
String dataにテキストフィールドの値を保存し、byte型配列に変換しbに代入しています。
getNumRecordsでレコードの存在の有無を確認し、無ければデータを登録し有れば変更するようになっています。
//レコードの切断 record.closeRecordStore();
最後に使用したレコードを切断して終了です。
※ファイル操作の場合はかならず例外処理をいれておきましょう。
//レコードストアの接続
record = RecordStore.openRecordStore("memo",false);
ここからはデータの読込をする箇所です。
書込の時と同じようにRecordStore.openRecordStoreで接続します。
第2引数はfalseになります。
//レコードストアを読込 byte[] b = record.getRecord(1); memo = new String(b); inputTextBox.setString(memo);
record.getRecordで読込、バイト型配列にデータを格納し、その結果を文字列型に変換してテキストフィールドに反映しています。
//レコードストアの切断 record.closeRecordStore();
切断は保存の時と同じですね。







