Record Management
System是J2ME的一個重要的子系統,目的是實現應用程式本地資料的持久性儲存。目前支援檔案系統的行動資訊設備仍有限,因此Record
Management System是J2ME開發人員實現本地資料儲存的首選途徑。本文的目的就是全面的介紹Record Management
System的知識。
顧名思義Record Management System是治理資料的系統,Record是系統中最重要的實體。在行動裝置儲存空間儲存的並不是字段,而是位元組數組。 Mobile Infomation Device PRofile(MIDP)規範中並沒有規定什麼樣的數據才能儲存為記錄,事實上記錄是任何可以被位元組數組表示的數據,例如圖片、文字等。 Record
Management
System的職責是儲存和唯一識別記錄,而表示資料的任務是由應用程式來完成的,因此J2ME的開發人員往往要花費更多的精力來處理儲存空間中的資料。這樣做的目的是簡化MIDP的實現,使得J2ME的子系統盡量的小巧、靈活。究竟移動資訊設備的儲存空間和處理器的能力都有限。
Record Store是一系列記錄的有序集合,記錄是不能單獨存在的,必須屬於Record Store。 Record Store保證記錄的讀寫操作都是原子的,資料不會被破壞。在API中Record Store是由javax.microedition.rms.RecordStore實現的,關於RecordStore的具體操作在接下來的文章中會有具體的介紹。
MIDP規格中說明行動資訊設備要提供至少8K的非揮發性儲存空間給應用程式來實現資料的持久性儲存。但是不同的設備提供的空間並不相同。假如MIDlet
suite使用了Record Management
System,那麼它必須在MANIFEST檔案和JAD檔案中透過設定MIDlet-Data-Size來說明它所需要的最小的資料儲存空間,單位是位元組,例如MIDlet-Data-Size:8192。假如你的值超過了行動裝置規定的最大值那麼你的應用程式將無法正確安裝。這個值並不是行動裝置真正提供給應用程式的最大Record
Management
System的儲存空間,往往要大一些,因此開發人員應該避免把應用程式需要的最小儲存空間設定的過大,必要的時候應該參考相關設備的說明手冊。在非揮發性儲存空間內讀寫資料往往速度會比較慢,因此針對頻繁存取的資料最好提供快取的機制來提供效能。 Record
Management System的讀寫操作是執行緒安全的,但由於Record Store是被整個MIDlet
suite共享的,所以假如不同MIDlet上運行的線程操作Record Store的時候,我們應該進行必要的線程同步,避免資料被破壞。
MIDP1.0和MIDP2.0中關於Record
Management System的實作有些不同,在同一個MIDlet suite裡面的MIDlets可以互相存取彼此的Record
Store。但是在MIDP1.0的實作中,並沒有提供在不同MIDlet suite之間共用Record
Store的機制。在MIDP2.0中提供的了新的API來解決不同MIDlet suite之間共享Record
Store的問題,在創建Record Store的時候透過授權模式和讀寫控制參數來進行共享機制的治理,我將在下篇文章中進行具體的介紹。
加強對Record
Management
System的理解的最好的方法就是進行實際的開發,在進行開發中我發現並不是所有行動裝置的MIDP實作都準確無誤。當我用getSizeAvaliable()方法查詢Nokia6108的可用Record
Store空間的時候得到的數值是超過1M字節,但是當我寫入40K的資料的時候就出現了RecordStoreFullException異常,因此我編寫了一個自動測試手機Record
Store最大儲存空間的軟體。原理是每隔一定時間例如100-500毫秒向Record
Store內寫入1K位元組的數據,當拋出儲存空間已滿的異常的時候就可以得到最大值了,精確單位為K位元組。以下是程式的原始碼和JAD檔的內容,開發平台為Eclipse3.0RC2+EclipseME0.4.1+Wtk2.1+J2SDK1.4.2._03,在真機Nokia 6108上測試通過並顯示最大值為31K。 (請不要在模擬器上進行測試,那樣結果沒有意義)
總結:本文只是帶領讀者對Record
Management System進行了大致的了解,雖然在文章最後提供了一個應用程式。但並沒有深入分析如何使用Record
Management
System。在接下來的文章中我們會深入分析javax.microedition.rms套件中的類,重點是如何使用RecordStore類別。
㟎 import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;🀜dition 『〜〜.AlertType;Lhod) 『
import javax.microedition.midlet.MIDlet;
import javax.microedition .midlet.MIDletStateChangeException;
import javax.microedition.rms.RecordStoreException;
公有類別RMSAnalyzer 擴充了MIDlet
{
{
私有Display 顯示;
〜私有警報; 受保護的void startApp() 拋出MIDletStateChangeException
{
display = Display.getDisplay (RMSAnalyzer.this) ;
lert = new Alert("錯誤提示");
try
{Property
try
{Property
);
int t = Integer.parseInt(interval);
counterCan瓦斯= new CounterCanvas(t, 1, this);
凡{凡凡凡凡凡
凡凡凡顯示.setCurrent(counterCanvas );
佛
}
回傳顯示;
}
受保護的無效暫停App()
{.拋出MIDletStateChangeException
{
}
public void showAlertError(String_.
alert.setType(AlertType.ERROR );
alert.setTimeout(3000);
display.setCurrent (警報);
導入java.java.java.java;.coml. .microedition.lcdui.Canvas;
導入javax.microedition.lcdui.Command;
進口導入javax. microedition.lcdui.CommandListener;導入javax.microedition.lcdui.Displayable; javax.microedition.midlet.MIDletStateChangeException;導入javax.microedition.rms.*;公用類別CounterCanvas 擴充了Canvas 實作了CommandListener
『{zer〜RMS 私有」素 接生模型;
私有int interTime;
私有int counter;
private boolean go = true;
public static Command backCommand = new Command("退出", Command.EXIT, 3);公共靜態最終int INC = 1;公共計時器終端計時器= new Timer();公用CounterCanvas(int interTime, int base, RMSAnalyzer rmsa )
拋出RecordStoreException
這.counter = base;
這.RMSanalyzer = rmsa;
模型= new RMSModel(base, RMSanalyzer);
this.addCommand( backCommand);
this.setCommandListener(this);
this.setCommandList
{
public void run()
{
嘗試
{w
嘗試
嘗試模型。
} catch ( RecordStoreFullException e)
{
go = false;
model.deleteRMS();
model.deleteRMS(); )
{模型.deleteRMS();
凡
凡RMSanalyzer.showAlertError(e.getMessage());
凡——凡凡凡凡凡}凡凡凡凡凡};凡凡凡this.counter = counter;
}
public void setInterTime(int interTime)
{ s受保護的空畫(圖arg0)
{
int SCREEN_WIDTH = this.getWidth();
int SCREEN_HEIGHT = this.getHeight(Height(Height(); /10,螢幕高度/ 2,
SCREEN_WIDTH * 4 / 5, 10);
if(RMSanalyzer.getDisplay().isColor(33) setColor(128, 128, 255);
}
arg0。 fillRect(SCREEN_WIDTH / 10, SCREEN_HEIGHT / 2, 計數器, 10);
if (!go)
以上就是J2ME學習-RMS從入門到精通之一的內容,更多相關內容請關注PHP中文網(www.php.cn)!