Record Management System (RMS) 是 MIDP 設備實現本地數據持久化的核心子系統。受限於移動設備存儲空間與處理能力,RMS 採用極簡設計:
主要方法:
openRecordStore(name, createIfNecessary)addRecord(byte[] data, offset, numBytes)getRecord(recordId, buffer, offset) / getRecord(recordId)setRecord(recordId, newData, offset, numBytes)deleteRecord(recordId)getSize() / getSizeAvailable()enumerateRecords(filter, comparator, keepUpdated)MANIFEST.MF 與 .jad 中聲明:MIDlet-Data-Size: 8192(單位:位元組)AUTHMODE_PRIVATE/PUBLIC) 與讀寫控制參數,支持跨 Suite 共享getSizeAvailable() 返回 1MB+,實寫 40K 即拋 RecordStoreFullException原理:定時器每 100-500ms 寫入 1KB,捕獲異常時得到上限(精度:KB)。
public class RMSAnalyzer extends MIDlet {
private Display display;
private CounterCanvas canvas;
protected void startApp() {
display = Display.getDisplay(this);
int interval = Integer.parseInt(getAppProperty("INTER")); // 間隔毫秒
canvas = new CounterCanvas(interval, 1, this);
display.setCurrent(canvas);
}
// ... 錯誤提示等輔助方法
}
class CounterCanvas extends Canvas implements CommandListener {
private RMSModel model;
private int counter = 1;
private boolean go = true;
private Timer timer = new Timer();
public CounterCanvas(int interval, int base, RMSAnalyzer analyzer) throws RecordStoreException {
this.model = new RMSModel(base, analyzer);
TimerTask task = new TimerTask() {
public void run() {
try {
model.writeRecord(1); // 寫入 1KB
counter++;
} catch (RecordStoreFullException e) {
go = false;
model.deleteRMS();
timer.cancel();
} catch (RecordStoreException e) {
model.deleteRMS();
analyzer.showAlertError(e.getMessage());
timer.cancel();
}
repaint();
}
};
timer.schedule(task, 1000, interval);
}
protected void paint(Graphics g) {
// 繪製進度條
if (!go) g.drawString("最大值:" + counter + "K字節", 0, 0, Graphics.TOP | Graphics.LEFT);
}
// ... 命令處理
}
測試環境:Eclipse 3.0 + EclipseME 0.4.1 + WTK 2.1 + J2SDK 1.4.2_03,Nokia 6108 實測上限 31KB(模擬器結果無參考值)。
深入剖析 javax.microedition.rms 包各類,重點講解 RecordStore 進階用法、數據序列化策略與跨 MIDlet Suite 共享實戰。