首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

J2ME RMS RecordFilter 與 RecordComparator 完整應用指南

     編輯:Java 相關知識

前言:RMS 記錄存儲的進階遍歷控制

J2ME Record Management System (RMS) 提供 RecordEnumeration 遍歷記錄,構造函數支援三個參數實現篩選、排序與同步控制:

RecordEnumeration enumerateRecords(RecordFilter filter, RecordComparator comparator, boolean keepUpdated)

參數詳解

參數類型功能預設行為
filterRecordFilter篩選記錄,實作 matches(byte[]) 返回 true 保留null:不篩選,返回所有記錄
comparatorRecordComparator排序記錄,實作 compare(byte[], byte[]) 返回 PRECEDES/FOLLOWS/EQUIVALENTnull:依記錄 ID 順序
keepUpdatedbooleantrue:追蹤 RMS 資料變動,即時反映增刪改;false:靜態快照,效能較好false(建議)

RecordFilter 實作與應用

介面定義

public interface RecordFilter {
  boolean matches(byte[] candidate);
}

實作範例:精確匹配「Hello」

public class HelloFilter implements RecordFilter {
  public boolean matches(byte[] rec) {
    String str = new String(rec);
    return "Hello".equals(str);
  }
}

使用方式

RecordStore rs = ...; // 開啟/建立 RecordStore
RecordFilter filter = new HelloFilter();
RecordEnumeration re = rs.enumerateRecords(filter, null, false);

if (re.hasNextElement()) {
  int recordId = re.nextRecordId();
  // 處理記錄...
}
re.destroy(); // 釋放資源

RecordComparator 實作與應用

介面定義

public interface RecordComparator {
  int compare(byte[] rec1, byte[] rec2);
  // 返回值常數:
  int PRECEDES = 0;      // rec1 在 rec2 之前
  int FOLLOWS = 1;       // rec1 在 rec2 之後
  int EQUIVALENT = 2;    // 位置相等
}

實作範例:字串升序排序

public class StringComparator implements RecordComparator {
  public int compare(byte[] rec1, byte[] rec2) {
    String s1 = new String(rec1);
    String s2 = new String(rec2);
    int result = s1.compareTo(s2);
    if (result == 0) return EQUIVALENT;
    return result < 0 ? PRECEDES : FOLLOWS;
  }
}

使用方式

RecordComparator comparator = new StringComparator();
RecordEnumeration re = rs.enumerateRecords(null, comparator, false);
// 遍歷即為排序後順序

綜合應用:篩選 + 排序

// 先篩選包含 "user_" 前綴的記錄,再按字串降序
RecordFilter prefixFilter = new RecordFilter() {
  public boolean matches(byte[] rec) {
    return new String(rec).startsWith("user_");
  }
};

RecordComparator descComparator = new RecordComparator() {
  public int compare(byte[] rec1, byte[] rec2) {
    return new String(rec2).compareTo(new String(rec1)); // 降序
  }
};

RecordEnumeration re = rs.enumerateRecords(prefixFilter, descComparator, false);

效能與最佳實踐

  • keepUpdated=false:大多數場景首選,建立快照後不追蹤變更,效能最佳
  • 避免複雜邏輯在 matches/compare 中:這些方法會被頻繁呼叫,影響遍歷速度
  • byte[] 轉 String 開銷大:考慮直接操作位元組或預先建立索引
  • 記得銷毀:RecordEnumeration.destroy() 釋放資源,防止記憶體洩漏
  • 記錄 ID 非連續:刪除記錄後 ID 不會重用,nextRecordId() 返回實際 ID

常見陷阱

  1. 實作 compare 時返回值邏輯反轉(PRECEDES/FOLLOWS 搞混)
  2. 未處理 null 記錄導致 NullPointerException
  3. 大量資料下使用 keepUpdated=true 導致 UI 卡頓
  4. 忘記在 finally 區塊呼叫 destroy()
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved