RMS (Record Management System) 是 J2ME 唯一的持久化儲存機制,配合 Vector 可輕鬆實作資料存取。本文以完整的通訊錄範例,示範 RMS 的增刪查改與列表顯示。
PhonesList:繼承 List,顯示通訊錄主畫面,支援新增/刪除/返回操作addPhone:繼承 Form,輸入姓名與電話並寫入 RMSRMSOpen:封裝 RMS 核心操作(開啟/關閉/新增/刪除/查詢全部)PhonesListpublic class PhonesList extends List implements CommandListener {
private Phones p;
private Command backCmd = new Command("返回", Command.BACK, 1);
private Command addCmd = new Command("新增", Command.SCREEN, 1);
private Command delCmd = new Command("刪除", Command.SCREEN, 1);
public PhonesList(Phones ph) {
super("通訊錄", List.IMPLICIT);
this.p = ph;
addCommand(backCmd); addCommand(addCmd); addCommand(delCmd);
setCommandListener(this);
}
public void loadPhoneList() {
Vector v = RMSOpen.getAllRMS();
for (int i = 0; i < v.size(); i++) {
append((String) v.elementAt(i), null);
}
RMSOpen.closeRMS();
}
private void deletePhone() {
RMSOpen.deleteRMS(getString(getSelectedIndex()));
RMSOpen.closeRMS();
}
public void commandAction(Command c, Displayable d) {
if (c == backCmd) p.chand("Main");
else if (c == addCmd) p.chand("addPhone");
else if (c == delCmd) { deletePhone(); p.chand("PhonesList"); }
}
}
addPhonepublic class addPhone extends Form implements CommandListener {
private Phones P;
private TextField tfName = new TextField("姓名:", "", 255, TextField.ANY);
private TextField tfPhone = new TextField("電話:", "", 255, TextField.PHONENUMBER);
private Command okCmd = new Command("確定", Command.OK, 1);
private Command backCmd = new Command("返回", Command.BACK, 1);
public addPhone(Phones p) {
super("新增電話");
this.P = p;
append(tfName); append(tfPhone);
addCommand(okCmd); addCommand(backCmd);
setCommandListener(this);
}
public void commandAction(Command c, Displayable d) {
if (c == backCmd) P.chand("PhonesList");
else if (c == okCmd) {
RMSOpen.addRMS(tfName.getString(), tfPhone.getString());
RMSOpen.closeRMS();
P.chand("PhonesList");
}
}
}
RMSOpenpublic class RMSOpen {
static RecordStore rs;
public static void openRMS() {
try { rs = RecordStore.openRecordStore("phonelist", true); }
catch (Exception e) { e.printStackTrace(); }
}
public static void closeRMS() {
try { rs.closeRecordStore(); }
catch (Exception e) { e.printStackTrace(); }
}
// 新增記錄:格式 "姓名:電話"
public static void addRMS(String name, String phone) {
openRMS();
try {
String data = name + ":" + phone;
rs.addRecord(data.getBytes(), 0, data.length());
} catch (Exception e) { e.printStackTrace(); }
}
// 刪除指定內容的記錄
public static void deleteRMS(String target) {
openRMS();
try {
int maxId = rs.getNextRecordID();
for (int i = 1; i < maxId; i++) {
byte[] rec = rs.getRecord(i);
if (new String(rec).equals(target)) {
rs.deleteRecord(i);
break;
}
}
} catch (Exception e) { e.printStackTrace(); }
}
// 取得所有記錄
public static Vector getAllRMS() {
openRMS();
Vector v = new Vector();
try {
RecordEnumeration re = rs.enumerateRecords(null, null, false);
while (re.hasNextElement()) {
v.addElement(new String(re.nextRecord()));
}
} catch (Exception e) { e.printStackTrace(); }
return v;
}
}
addRecord/deleteRecord/getRecord/enumerateRecordsgetRecord 的效能開銷姓名:電話 字串儲存,讀取後直接顯示於 ListRecordStoreException、InvalidRecordIDException 等 RMS 專屬例外此範例展示了 J2ME 本地儲存的完整流程,可直接作為通訊錄、記事本等應用的基礎架構。