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

J2ME 記錄管理系統(RMS)完整指南與電話約會簿實作

     編輯:Java 相關知識

J2ME 記錄管理系統(RMS)提供機制讓 MIDlet 持久儲存資料並日後檢索。面向記錄方法中,J2ME RMS 由多個記錄存儲組成。RMS 與 MIDlet 介面連接概貌如圖:

J2ME RMS 和 MIDlet 接口連接概貌

每個記錄存儲可想像為記錄集合,跨多個 MIDlet 調用持久存在。設備平台負責在正常使用全過程(含重啟、換電池)盡力維護 MIDlet 記錄存儲完整性。記錄存儲在平台相關位置(如非易失性設備儲存器)建立,不直接公開給 MIDlet。RMS 類調用平台特定本機代碼,使用標準 OS 資料管理器函數執行實際資料庫操作。

記錄存儲實現確保所有單一操作皆為原子、同步、序列化,多重存取不會資料損壞。記錄存儲有時間戳指示上次修改時間,維護版本號(整數,修改內容每發生一次加一),版本與時間戳對同步用途有用。MIDlet 多執行緒存取記錄存儲時,協調存取是 MIDlet 責任;否則可能出現不可預期結果。同樣,平台若用多執行緒執行同步,對 MIDlet 與同步引擎間記錄存儲實施排他存取是平台責任。記錄存儲中每筆記錄為位元組陣列,有唯一整數標識符。

管理設備資料庫

javax.microedition.rms.RecordStore 類別代表 RMS 記錄存儲,提供管理、插入、更新、刪除記錄方法。

管理記錄存儲

開啟記錄存儲調用 openRecordStore():

public static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary)

開啟指定名稱存儲;不存在時創建。若已開啟,返回同一物件引用。

RecordStore rs = RecordStore.openRecordStore("MyAppointments", true);

操作完成調用 closeRecordStore() 關閉;關閉後無法進一步操作。Rs.closeRecordStore(); 調用 deleteRecordStore() 刪除指定名稱存儲。RecordStore.deleteRecordStore("MyAppointments");

插入記錄

調用 addRecord() 插入新記錄,阻塞原子操作,返回新記錄 recordId。返回前記錄寫入持久儲存。

public int addRecord(byte[] data, int offset, int numBytes)
String appt = "new record";
byte bytes[] = appt.getBytes();
rs.addRecord(bytes, 0, bytes.length);

更新記錄

更新特定記錄包括取得記錄控制代碼與設定新資訊。

public int getRecord(int recordId, byte[] buffer, int offset)
public byte[] getRecord(int recordId)
public void setRecord(int recordId, byte[] newData, int offset, int numBytes)
String newappt = "update record";
byte data = newappt.getBytes();
rs.setRecord(1, data, 0, data.length);

刪除記錄

調用 deleteRecord() 刪除記錄。public void deleteRecord(int recordId) 刪除指定記錄,其 recordId 之後不可重用。rs.deleteRecord(1);

資料解釋機制

J2ME API 提供介面解釋儲存於記錄存儲的資料:比較記錄確定相對排序、依給定條件內容過濾。

比較記錄

MIDlet 實作 RecordComparator 介面,定義 compare(byte[] rec1, byte[] rec2) 比較兩候選記錄,返回值指示順序。

int compare(byte[] b1, byte[] b2) {
    String s1 = new String(b1);
    String s2 = new String(b2);
    if (s1.compareTo(s2) > 0) return RecordComparator.FOLLOWS;
    else if (s1.compareTo(s2) == 0) return RecordComparator.EQUIVALENT;
    else return RecordComparator.PRECEDES;
}

列舉記錄

RecordEnumeration 介面負責列舉記錄存儲記錄。邏輯上維護記錄存儲中一連串 recordId。列舉器以記錄比較器確定順序迭代所有記錄(或若提供可選記錄過濾器則僅子集)。若未指定過濾器與比較器,以未定義順序遍歷所有記錄。

RecordEnumeration re = rs.enumerateRecords(null, null, false);
if (re.hasNextElement()) byte nextRec[] = re.nextRecord();

過濾記錄

MIDlet 實作 RecordFilter 介面,定義檢查記錄是否滿足應用定義標準的過濾器。實作 match() 方法選擇 RecordEnumeration 返回的記錄。

public boolean matches(byte[] candidate) {
    String s1 = new String(candidate);
    if (s1.equals("XX")) return true;
    else return false;
}

開發電話約會簿實戰

透過建構電話約會簿說明 J2ME RMS 功能。應用允許使用者設定某日期時間約會、取消約會、查看已設約會列表。快捷畫面視圖如圖:

工作中的電話約會簿

構成應用的各種畫面與畫面元素 UI 完整列表可參考 MID Framework API 文檔(隨 J2ME Wireless Toolkit 提供),詳細資訊請查閱筆者早期 developerWorks 文章(參考資料區)。

記錄存儲以位元組流形式儲存記錄。應用中使用者輸入日期時間串接成字串,轉換成位元組儲存。

String appt = apptName + " " + apptTime;
byte bytes[] = appt.getBytes();
rs.addRecord(bytes, 0, bytes.length);

同樣以位元組流檢索記錄轉字串。字串格式 ####AAAA,# 代表時間資訊數字,AAAA 代表約會描述字元。應用解析字串取得日期時間,以使用者期望格式顯示:description - mm/dd/yyyy hh:mm AM_PM。

byte b[] = rs.getRecord(j);
String str = new String(b, 0, b.length);
if (Character.isDigit(str.charAt(i))) at += str.charAt(i);
else name += str.charAt(i);
time = Long.parseLong(at);
java.util.Date date = new java.util.Date(time);
java.util.Calendar rightNow = java.util.Calendar.getInstance();
rightNow.setTime(date);
String year = String.valueOf(rightNow.get(java.util.Calendar.YEAR));
String month = String.valueOf(rightNow.get(java.util.Calendar.MONTH) + 1);
String day = String.valueOf(rightNow.get(java.util.Calendar.DATE));
String displayName = name + "-" + year + " " + day;

使用者可從記錄存儲選擇約會並刪除。為維持記錄原始順序,被刪除 recordId 不可重用,故以特有字串模式標記為無效。

String deactive = "@";
byte b[] = deactive.getBytes();
rs.setRecord(m+1, b, 0, b.length);

顯示約會列表時,檢測無效記錄字串模式並跳過。

if (!(str.startsWith("@"))) { /* 記錄有效 */ }
else { /* 記錄無效 */ }

使用者介面架構

重要層面為使用者介面,各畫面包括:

  • 歡迎表單: 顯示已設約會列表,無約會則通知使用者。提供繼續或退出選項。
  • 選單表單: 提供查看約會、設定新約會、取消約會選項。
  • 顯示表單: 顯示已設約會列表。
  • 設定表單: 提供日期選擇欄位與輸入文字欄位提供新約會詳情。使用者選擇儲存時存入資料庫。
  • 刪除表單: 列出一組約會,提供選擇一或多個選項。選擇刪除時,所選約會在記錄存儲標記為無效。

應用實作 CommandListener 與 ItemStateListener 介面響應各種事件。ItemStateListener 接收內部狀態改變事件:DateField(可編輯日期時間組件)、TextField(可編輯文字組件)、ChoiceGroup(可選元素組)。

// 日期值在 DateField 項目改變時設定給變數
if (item == apptDate) {
    date = apptDate.getDate();
    apptTime = String.valueOf(date.getTime());
}
// 約會名稱在輸入欄位改變時設定給變數
if (item == apptField) {
    apptName = apptField.getString();
}
// 刪除表單 ChoiceGroup 項目狀態改變時,設定待刪除約會陣列
if (item == cg) {
    cg.getSelectedFlags(deleted);
}

完整範例程式碼請參考列表 16。下載設備模擬器在桌面運行程式請參考參考資料區筆者早期 J2ME 文章。

總結

本文闡述 MID 應用持久儲存與檢索資料能力,機制依簡單面向記錄資料庫建模。javax.microedition.rms 套件提供開發者方法與介面寶庫,利用 MID 應用此獨特功能。現在您應能將資料儲存整合至自有微型 Java 應用中。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved