| 方法 | 用途 |
openRecordStore(name, createIfNecessary) | 開啟/創建存儲 |
getNumRecords() | 記錄總數 |
getRecordSize(recordId) | 單條記錄位元組數 |
getRecord(recordId) | 讀取整條記錄(回傳 byte[]) |
getRecord(recordId, buffer, offset) | 讀取到預分配緩衝區 |
addRecord(data, offset, len) | 新增記錄,回傳新 recordId |
setRecord(recordId, data, offset, len) | 更新指定記錄 |
deleteRecord(recordId) | 刪除單條記錄 |
deleteRecordStore(name) | 刪除整個存儲 |
closeRecordStore() | 關閉存儲 |
基本操作流程
1. 開啟/創建
RecordStore rs = null;
try {
rs = RecordStore.openRecordStore("highscore", true); // 不存在則創建
} catch (Exception e) {
System.err.println("Open failed: " + e);
}
2. 寫入高分(新增或更新)
// 假設只存一條最高分,recordId 固定為 1
int score = 12345;
byte[] data = intToBytes(score); // 自行實現 int→byte[4] 大端序
try {
if (rs.getNumRecords() == 0) {
rs.addRecord(data, 0, data.length); // 第一次
} else {
rs.setRecord(1, data, 0, data.length); // 更新
}
} catch (Exception e) { /* handle */ }
3. 讀取高分(已知長度 4 字節)
byte[] buf = new byte[4];
try {
if (rs.getNumRecords() > 0) {
rs.getRecord(1, buf, 0);
int highScore = bytesToInt(buf);
}
} catch (Exception e) { /* handle */ }
4. 讀取未知長度記錄(兩種方式)
// 方式一:預分配足夠大緩衝區
byte[] buf = new byte[100]; // 假設不超過 100 字節
int len = rs.getRecord(recordId, buf, 0); // 回傳實際讀取長度
// 方式二:先查大小再精確分配
int size = rs.getRecordSize(recordId);
byte[] exact = new byte[size];
rs.getRecord(recordId, exact, 0);
5. 刪除與關閉
// 刪除整個存儲
RecordStore.deleteRecordStore("highscore");
// 正常關閉
try { rs.closeRecordStore(); } catch (Exception e) {}
完整「最高分管理器」範例
public class HighScoreManager {
private static final String STORE_NAME = "highscore";
private RecordStore rs;
public HighScoreManager() {
try { rs = RecordStore.openRecordStore(STORE_NAME, true); }
catch (RecordStoreException e) { e.printStackTrace(); }
}
public int getHighScore() {
try {
if (rs.getNumRecords() == 0) return 0;
byte[] buf = new byte[4];
rs.getRecord(1, buf, 0);
return bytesToInt(buf);
} catch (Exception e) { return 0; }
}
public void saveHighScore(int score) {
try {
byte[] data = intToBytes(score);
if (rs.getNumRecords() == 0) rs.addRecord(data, 0, 4);
else rs.setRecord(1, data, 0, 4);
} catch (Exception e) { e.printStackTrace(); }
}
public void close() {
try { if (rs != null) rs.closeRecordStore(); } catch (Exception e) {}
}
// 大端序 int↔byte[4]
private static byte[] intToBytes(int v) {
return new byte[] {
(byte)(v >> 24), (byte)(v >> 16), (byte)(v >> 8), (byte)v
};
}
private static int bytesToInt(byte[] b) {
return ((b[0] & 0xFF) << 24) | ((b[1] & 0xFF) << 16) | ((b[2] & 0xFF) << 8) | (b[3] & 0xFF);
}
}
遊戲中使用
// 初始化
HighScoreManager hsm = new HighScoreManager();
// 讀取顯示
int best = hsm.getHighScore();
// 遊戲結束更新
if (currentScore > best) hsm.saveHighScore(currentScore);
// 退出釋放
hsm.close();
避坑提醒
- RMS 操作較慢,避免在遊戲主迴圈頻繁讀寫,僅在啟動/結束時操作。
recordId 刪除後不會重用,長期增刪會留下空洞,定期重建存儲可緩解。
- 不同 MIDlet 套件(不同 JAR)無法互訪 RMS,需簽名同套件或用 JSR 75 文件系統共享。
- 記住
closeRecordStore(),否則資料可能不落盤。
- 上一篇文章: Java ME 應用設計指南:多網絡連接並發控制與 JAD 適配策略
- 下一篇文章: Java ME RMS 通用持久化框架設計:Serializable/Lazy/RecordFetcher/RMSUtil 四層架構
Copyright ©
程式碼之家 All Rights Reserved