J2ME 記錄管理存儲_JSP教程
推薦:MVC模式在j2me項目中的應用二版權(quán)聲明:本文同時發(fā)表在www.j2medev.com和我的Blog(blog.csdn.net/alikeboy)上,如果需要轉(zhuǎn)載,有三個途徑:1)聯(lián)系我并經(jīng)我同意;2)和www.j2medev.com有轉(zhuǎn)載文章合作協(xié)議的 3)
移動信息設備框架(Mobile Information Device Profile)和 移動 Java 應用程序的平臺 為 MIDP 應用程序提供一種跨多個調(diào)用持久存儲數(shù)據(jù)的機制。這種持久存儲機制可以被視為一種簡單的面向記錄的數(shù)據(jù)庫模型,被稱為記錄管理系統(tǒng)(record management system(RMS))。 在此,Soma Ghosh 說明了您的 J2ME 應用程序怎樣能夠使用 RMS 來管理和解釋數(shù)據(jù)。通過一個樣本電話數(shù)據(jù)庫,您還將了解到關(guān)于這個概念的說明。
J2ME 記錄管理系統(tǒng)
J2ME 記錄管理系統(tǒng)(RMS)提供了一種機制,通過這種機制,MIDlet 能夠持久存儲數(shù)據(jù),并在以后檢索數(shù)據(jù)。在面向記錄的方法中,J2ME RMS 由多個記錄存儲構(gòu)成。
可以將每個記錄存儲想像成一個記錄集合,它將跨多個 MIDlet 調(diào)用持久存在。設備平臺負責在平臺正常使用的整個過程(包括重新啟動、換電池等)中,盡全力維護 MIDlet 的記錄存儲的完整性。
記錄存儲在與平臺相關(guān)的位置(比如非易失性設備存儲器)創(chuàng)建,這些位置不直接公開給 MIDlet。RMS 類調(diào)用特定于平臺的本機代碼,這種本機代碼使用標準 OS 數(shù)據(jù)管理器函數(shù)來執(zhí)行實際的數(shù)據(jù)庫操作。
記錄存儲實現(xiàn)確保所有單個的記錄存儲操作都是原子的、同步的以及序列化的,因此多個訪問將不會出現(xiàn)數(shù)據(jù)毀壞。記錄存儲被蓋上時間戳來指示它上次被修改的時間。記錄存儲還維護版本(version),它是一個整數(shù),修改記錄存儲內(nèi)容的操作每發(fā)生一次,這個數(shù)加一。版本和時間戳對于同步目的很有用。
當 MIDlet 使用多個線程訪問一個記錄存儲時,協(xié)調(diào)該訪問是 MIDlet 的責任;如果它不能這樣做,可能出現(xiàn)無法意料的結(jié)果。同樣,如果一個平臺使用試圖同時訪問記錄存儲的多個線程執(zhí)行記錄存儲的同步,那么對 MIDlet 及其同步引擎之間的記錄存儲實施排外訪問是平臺的責任。
記錄存儲中的每個記錄是一個字節(jié)數(shù)組,并且有唯一的整數(shù)標識符。
管理設備數(shù)據(jù)庫
javax.microedition.rms.RecordStore 類代表 RMS 記錄存儲。它提供了幾個方法來管理以及插入、更新和刪除記錄存儲中的記錄。
管理記錄存儲
要打開一個記錄存儲,調(diào)用 javax.microedition.rms.RecordStore 的 openRecordStore() 方法。public static RecordStore openRecordStore(String recordStoreName, boolean createIfNecessary) 打開具有指定名稱 recordStoreName 的記錄存儲。如果沒有具有這個名稱的記錄存儲,那么調(diào)用這個方法來創(chuàng)建一個。
如果記錄存儲已經(jīng)打開,這個方法將返回對同一個記錄存儲對象的引用。
清單 1. 打開一個 RecordStore
RecordStore rs = RecordStore.openRecordStore("MyAppointments",true);
一旦所有操作完成,對 closeRecordStore() 的調(diào)用將關(guān)閉指定名稱的記錄存儲。當一個記錄存儲被關(guān)閉時,不能進行進一步的操作。
清單 2. 關(guān)閉一個 RecordStore
Rs.closeRecordStore();
通過調(diào)用 deleteRecordStore() 方法可以刪除指定名稱的記錄存儲。
清單 3. 刪除一個 RecordStore
RecordStore.deleteRecordStore("MyAppointments");
插入記錄
MIDlet 調(diào)用 javax.microedition.rms.RecordStore 類的 addRecord() 方法來將一條新記錄插入到記錄存儲中。這是阻塞的原子操作,并返回新記錄的 recordId。在這個方法返回之前,記錄被寫到持久存儲中。
public int addRecord(byte[] data, int offset, int numBytes) 插入一條由字節(jié)數(shù)組 data 代表的記錄,這個數(shù)組以 offset 作為它的起始索引,numBytes 作為它的長度。
清單 4. 插入一條記錄
String appt = "new record"; |
更新一條特殊記錄包括獲取這個記錄的句柄以及設置新信息。
public int getRecord(int recordId, byte[] buffer, int offset) 返回存儲在由 buffer 代表的字節(jié)數(shù)組中給定記錄的數(shù)據(jù)。public byte[] getRecord(int recorded) 返回由 recordId 代表的數(shù)據(jù)的副本。public void setRecord(int recordId, byte[] newData, int offset, int numBytes) 在 recordId 所代表記錄的位置設置新信息,新信息是以 offset 作為它的起始索引,并以 numBytes 作為它的長度的字節(jié)流(newData)。
清單 5. 更新一條記錄
String newappt = "update record"; |
MIDlet 調(diào)用 deleteRecord() 方法來從記錄存儲中刪除記錄。
public void deleteRecord(int recordId) 刪除由 recordId 代表的記錄。這個記錄的 recordId 接下來不能重用。
清單 6. 刪除一條記錄
Rs.deleteRecord(1);
數(shù)據(jù)解釋
J2ME API 提供某種接口來解釋存儲在記錄存儲中的數(shù)據(jù)。這個過程包括比較記錄來確定它們的相對排序。它還包括根據(jù)給定條件的內(nèi)容過濾。
比較記錄
MIDlet 實現(xiàn) RecordComparator 接口,并定義 compare (byte[] rec1, byte[] rec2) 方法來比較兩個候選記錄。這個方法的返回值必須指示這兩條記錄的順序。
清單 7. 比較記錄并確定相對排序
Int compare (byte[] b1, byte[] b2) |
枚舉記錄
RecordEnumeration 接口負責枚舉記錄存儲中的記錄。它邏輯上維護記錄存儲中一連串的記錄的 recordId。枚舉器將以記錄比較器確定的順序迭代所有記錄(或者如果提供了一個可選的記錄過濾器,那么只是一個子集)。如果既沒有指定過濾器又沒有指定比較器,枚舉將以未定義的順序遍歷記錄存儲中的所有記錄。
清單 8. 枚舉記錄
RecordEnumeration re = rs.enumerateRecords(null, null, false);
If (re.hasNextElement())
Byte nextRec[] = re.nextRecord();
過濾記錄
MIDlet 實現(xiàn) RecordFilter 接口,定義檢查記錄是否滿足應用程序定義的標準的過濾器。這個應用程序?qū)崿F(xiàn) RecordFilter 的 match() 方法來選擇 RecordEnumeration 返回的記錄。
清單 9. 過濾記錄
Public boolean matches(byte[] candidate) |
在這部分,我們將通過構(gòu)建一個電話約會簿來說明 J2ME RMS 的功能。這個應用程序?qū)⒃试S用戶設置某個日期和時間的約會,取消約會或查看已經(jīng)設置好的約會列表。
構(gòu)成這個應用程序的各種屏幕以及屏幕元素的用戶界面元素的完整列表在與 J2ME Wireless Toolkit 一起提供的 MID 框架 API 文檔中可以得到。
記錄存儲可以以字節(jié)流形式存儲記錄。在我們的應用程序中,用戶輸入的日期和時間被連接成一個字符串,轉(zhuǎn)換成字節(jié),然后被存儲。
清單 10. 將一個新的約會添加到數(shù)據(jù)庫中
Public boolean matches(byte[] candidate) |
清單 11. 從記錄存儲檢索一條記錄
byte b[] = rs.getRecord(j);
String str = new String(b,0,b.length);
清單 12. 解析從記錄存儲獲得的數(shù)據(jù),然后以用戶所希望的格式顯示
if (Character.isDigit(str.charAt(i))) |
用戶被允許從記錄存儲中選擇某種約會以及將它們從記錄存儲中刪除。因為為了維持記錄中原始的順序所刪除的 recordId 不能重用,所以這個記錄通過特有的字符串模式標記為無效。
清單 13. 將一條記錄標記為已刪除
String deactive = "@"; |
清單 14. 跳過無效記錄
if (!(str.startsWith("@"))) |
歡迎表單:歡迎表單顯示一個已經(jīng)設置好的約會列表,如果沒有設置約會,則通知用戶。它提供繼續(xù)或退出這個應用程序的各種選項。
菜單表單:菜單表單給用戶提供查看約會、設置新約會或取消約會等選項。
顯示表單:顯示表單顯示已經(jīng)設置好的約會列表。
設置表單:設置表單提供一個日期選擇域和一個輸入文本域,以提供新約會的詳細信息。當用戶選擇保存時,這條信息被存儲到數(shù)據(jù)庫中。
刪除表單:刪除表單列出一組約會,并提供選擇一個或多個的選項。如果用戶選擇刪除,所選擇的這組約會在記錄存儲中被標記為無效。
應用程序?qū)崿F(xiàn)使自己能夠響應各種事件的 CommandListener 和 ItemStateListener 接口。ItemStateListener 使應用程序能夠接收指示下面這些東西的內(nèi)部狀態(tài)的改變的事件:
DateField,一個顯示日期和時間的可編輯組件
TextField,一個可編輯文本組件
ChoiceGroup,一組可選擇的元素
清單 15. 從屏幕獲取值
|
清單 16 包含這個樣本應用程序的完整清單。
總結(jié)
在本文中,我們講述了 MID 應用程序持久存儲和檢索數(shù)據(jù)的能力;這種機制根據(jù)簡單的面向記錄的數(shù)據(jù)庫建模。J2ME API javax.microedition.rms 包提供了一個開發(fā)者的方法和接口寶庫,從而可以利用 MID 應用程序的這種獨特功能。現(xiàn)在,您應該能夠?qū)?shù)據(jù)存儲集成到您自己的微型 Java 應用程序中了
分享:MVC模式在j2me項目中的應用一版權(quán)聲明:本文同時發(fā)表在www.j2medev.com和我的Blog(blog.csdn.net/alikeboy)上,如果需要轉(zhuǎn)載,有三個途徑:1)聯(lián)系我并經(jīng)我同意;2)和www.j2medev.com有轉(zhuǎn)載文章合作協(xié)議的 3)
- jsp response.sendRedirect不跳轉(zhuǎn)的原因分析及解決
- JSP指令元素(page指令/include指令/taglib指令)復習整理
- JSP腳本元素和注釋復習總結(jié)示例
- JSP FusionCharts Free顯示圖表 具體實現(xiàn)
- 網(wǎng)頁模板:關(guān)于jsp頁面使用jstl的異常分析
- JSP頁面中文傳遞參數(shù)使用escape編碼
- 基于jsp:included的使用與jsp:param亂碼的解決方法
- Java Web項目中連接Access數(shù)據(jù)庫的配置方法
- JDBC連接Access數(shù)據(jù)庫的幾種方式介紹
- 網(wǎng)站圖片路徑的問題:絕對路徑/虛擬路徑
- (jsp/html)網(wǎng)頁上嵌入播放器(常用播放器代碼整理)
- jsp下顯示中文文件名及絕對路徑下的圖片解決方法
- 相關(guān)鏈接:
- 教程說明:
JSP教程-J2ME 記錄管理存儲
。