程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> J2ME記錄治理存儲(RMS)

J2ME記錄治理存儲(RMS)

編輯:J2ME

移動信息設備框架(Mobile Information Device Profile)? 移動 Java 利用程序的平台 ? 為 MIDP 利用程序供給一種跨多個調用持久存儲數據的機制。這種持久存儲機制可以被視為一種簡略的面向記錄的數據庫模型,被稱為記錄治理系統(record management system(RMS))。在此,Soma Ghosh 闡明了您的 J2ME 利用程序怎樣能夠應用 RMS 來治理和說明數據。通過一個樣本電話數據庫,您還將懂得到關於這個概念的闡明。

J2ME 記錄治理系統

J2ME 記錄治理系統(RMS)供給了一種機制,通過這種機制,MIDlet 能夠持久存儲數據,並在以後檢索數據。在面向記錄的方法中,J2ME RMS 由多個記錄存儲構成。

可以將每個記錄存儲想像成一個記錄聚集,它將跨多個 MIDlet 調用持久存在。設備平台負責在平台正常應用的全部過程(包含重新啟動、換電池等)中,盡全力保護 MIDlet 的記錄存儲的完整性。

記錄存儲在與平台相干的地位(比如非易失性設備存儲器)創立,這些地位不直接公然給 MIDlet。RMS 類調用特定於平台的本機代碼,這種本機代碼應用尺度 OS 數據治理器函數來履行實際的數據庫把持。

記錄存儲實現確保所有單個的記錄存儲把持都是原子的、同步的以及序列化的,因此多個拜訪將不會呈現數據損壞。記錄存儲被蓋上時間戳來唆使它上次被修正的時間。記錄存儲還保護版本(version),它是一個整數,修正記錄存儲內容的把持每產生一次,這個數加一。版本和時間戳對於同步目標很有用。

當 MIDlet 應用多個線程拜訪一個記錄存儲時,和諧該拜訪是 MIDlet 的義務;假如它不能這樣做,可能呈現無法意料的成果。同樣,假如一個平台應用試圖同時拜訪記錄存儲的多個線程履行記錄存儲的同步,那麼對 MIDlet 及其同步引擎之間的記錄存儲實行排外拜訪是平台的義務。

記錄存儲中的每個記錄是一個字節數組,並且有唯一的整數標識符。

治理設備數據庫
Javax.microedition.rms.RecordStore 類代表 RMS 記錄存儲。它供給了幾個方法來治理以及插進、更新和刪除記錄存儲中的記錄。

治理記錄存儲
要打開一個記錄存儲,調用 Javax.microedition.rms.RecordStore 的 openRecordStore() 方法。public static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary) 打開具有指定名稱 recordStoreName 的記錄存儲。假如沒有具有這個名稱的記錄存儲,那麼調用這個方法來創立一個。

假如記錄存儲已經打開,這個方法將返回對同一個記錄存儲對象的引用。

清單 1. 打開一個 RecordStore
RecordStore rs = RecordStore.openRecordStore("MyAppointments",true);

一旦所有把持完成,對 closeRecordStore() 的調用將封閉指定名稱的記錄存儲。當一個記錄存儲被封閉時,不能進行進一步的把持。

清單 2. 封閉一個 RecordStore
Rs.closeRecordStore();

通過調用 deleteRecordStore() 方法可以刪除指定名稱的記錄存儲。

清單 3. 刪除一個 RecordStore
RecordStore.deleteRecordStore("MyAppointments");

插進記錄
MIDlet 調用 Javax.microedition.rms.RecordStore 類的 addRecord() 方法來將一條新記錄插進到記錄存儲中。這是阻塞的原子把持,並返回新記錄的 recordId。在這個方法返回之前,記錄被寫到持久存儲中。

public int addRecord(byte[] data, int offset, int numBytes) 插進一條由字節數組 data 代表的記錄,這個數組以 offset 作為它的起始索引,numBytes 作為它的長度。

清單 4. 插進一條記錄
String aPPT = "new record";
byte bytes[] = aPPT.getBytes();
rs.addRecord(bytes,0,bytes.length);

更新記錄
更新一條特別記錄包含獲取這個記錄的句柄以及設置新信息。

public int getRecord(int recordId, byte[] buffer, int offset) 返回存儲在由 buffer 代表的字節數組中給定記錄的數據。public byte[] getRecord(int recorded) 返回由 recordId 代表的數據的副本。public void setRecord(int recordId, byte[] newData, int offset, int numBytes) 在 recordId 所代表記錄的地位設置新信息,新信息是以 offset 作為它的起始索引,並以 numBytes 作為它的長度的字節流(newData)。

清單 5. 更新一條記錄
String newaPPT = "update record";
Byte data = newaPPT.getBytes();
Rs.setRecord(1, data, 0, data.length());

刪除記錄
MIDlet 調用 deleteRecord() 方法來從記錄存儲中刪除記錄。

public void deleteRecord(int recordId) 刪除由 recordId 代表的記錄。這個記錄的 recordId 接下來不能重用。

清單 6. 刪除一條記錄
Rs.deleteRecord(1);

數據說明
J2ME API 供給某種接口來說明存儲在記錄存儲中的數據。這個過程包含比擬記錄來斷定它們的相對排序。它還包含根據給定條件的內容過濾。

比擬記錄
MIDlet 實現 RecordComparator 接口,並定義 compare (byte[] rec1, byte[] rec2) 方法來比擬兩個候選記錄。這個方法的返回值必需唆使這兩條記錄的次序。

清單 7. 比擬記錄並斷定相對排序
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。枚舉器將以記錄比擬器斷定的次序迭代所有記錄(或者假如供給了一個可選的記錄過濾器,那麼只是一個子集)。假如既沒有指定過濾器又沒有指定比擬器,枚舉將以未定義的次序遍歷記錄存儲中的所有記錄。

清單 8. 枚舉記錄
RecordEnumeration re = rs.enumerateRecords(null, null, false);
If (re.hasNextElement())
   Byte nextRec[] = re.nextRecord();

過濾記錄
MIDlet 實現 RecordFilter 接口,定義檢查記錄是否滿足利用程序定義的尺度的過濾器。這個利用程序實現 RecordFilter 的 match() 方法來選擇 RecordEnumeration 返回的記錄。

清單 9. 過濾記錄
Public boolean matches(byte[] candidate)
{
   String s1 = new String(candidate);
   If (s1.equals("XX"))
      Returns true;
   Else
      Returns false;
}

開發電話約會簿
在這部分,我們將通過構建一個電話約會簿來闡明 J2ME RMS 的功效。這個利用程序將答利用戶設置某個日期和時間的約會,取消約會或查看已經設置好的約會列表。

構成這個利用程序的各種屏幕以及屏幕元素的用戶界面元素的完整列表在與 J2ME Wireless Toolkit 一起供給的 MID 框架 API 文檔中可以得到;要獲取關於這些元素的更多具體信息,請查閱我早些時候給 developerWorks 寫的一篇文章(請參閱下面的參考材料部分以獲取這兩個鏈接)。

記錄存儲可以以字節流情勢存儲記錄。在我們的利用程序中,用戶輸進的日期和時間被連接成一個字符串,轉換成字節,然後被存儲。

清單 10. 將一個新的約會添加到數據庫中
Public boolean matches(byte[] candidate)
String appt = apptName + " " + aPPTTime;
byte bytes[] = aPPT.getBytes();
rs.addRecord(bytes,0,bytes.length);

同樣,這個利用程序以字節流情勢檢索記錄,然後將它轉換成一個字符串。這個字符串以 ####AAAA 格局,其中 # 表現代表時間信息的數字,AAAA 表現代表約會描寫的字符。這個利用程序解析這個字符串來獲得日期和時間信息,並以用戶所希看的格局顯示它們,比如 description - mm/dd/yyyy hh:mm AM_PM。

清單 11. 從記錄存儲檢索一條記錄
byte b[] = rs.getRecord(j);
String str = new String(b,0,b.length);

清單 12. 解析從記錄存儲獲得的數據,然後以用戶所希看的格局顯示
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 不能重用,所以這個記錄通過特有的字符串模式標記為無效。

清單 13. 將一條記錄標記為已刪除
String deactive = "@";
byte b[] = deactive.getBytes();
rs.setRecord(m+1, b,0,b.length);

當這個利用程序顯示一個約會列表時,它檢測那些無效記錄的字符串模式,然後跳過它們。

清單 14. 跳過無效記錄
if (!(str.startsWith("@")))
{
// Record is valid
}
else
{
// Record is invalid.
}

這個利用程序的一個重要的方面是用戶界面。各種屏幕有下面這些:

歡迎表單:歡迎表單顯示一個已經設置好的約會列表,假如沒有設置約會,則通知用戶。它供給持續或退出這個利用程序的各種選項。
菜單表單:菜單表單給用戶供給查看約會、設置新約會或取消約會等選項。
顯示表單:顯示表單顯示已經設置好的約會列表。
設置表單:設置表單供給一個日期選擇域和一個輸進文本域,以供給新約會的具體信息。當用戶選擇保留時,這條信息被存儲到數據庫中。
刪除表單:刪除表單列出一組約會,並供給選擇一個或多個的選項。假如用戶選擇刪除,所選擇的這組約會在記錄存儲中被標記為無效。
利用程序實現使自己能夠響應各種事件的 CommandListener 和 ItemStateListener 接口。ItemStateListener 使利用程序能夠接收唆使下面這些東西的內部狀態的轉變的事件:

DateFIEld,一個顯示日期和時間的可編纂組件
TextFIEld,一個可編纂文本組件
ChoiceGroup,一組可選擇的元素
清單 15. 從屏幕獲取值
// The date value is set to a variable when the
// DateFIEld item is changed
if (item == aPPTDate)
{
   date = aPPTDate.getDate();
   aPPTTime = String.valueOf(date.getTime());
}
// The name of appointment is set to a variable
//when the name input fIEld is changed
if (item == aPPTFIEld)
{
   apptName = aPPTFIEld.getString();
}

// If the ChoiceGroup item state on Delete form is
//changed, it sets an array of appointments selected for deletion
if (item == cg)

{
   cg.getSelectedFlags(deleted);
}

清單 16 包含這個樣本利用程序的完整清單。請參閱參考材料部分中我以前的一篇關於 J2ME 的文章,以獲取關於下載將使您能夠在桌面上運行這個程序的設備仿真器的領導。

總結
在本文中,我們講述了 MID 利用程序持久存儲和檢索數據的才能;這種機制根據簡略的面向記錄的數據庫建模。J2ME API javax.microedition.rms 包供給了一個開發者的方法和接口寶庫,從而可以利用 MID 利用程序的這種奇特功效。現在,您應當能夠將數據存儲集成到您自己的微型 Java 利用程序中了。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved