日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

J2ME 記錄管理存儲_JSP教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦: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";

byte bytes[] = appt.getBytes();

rs.addRecord(bytes,0,bytes.length);

更新記錄

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

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";

Byte data = newappt.getBytes();

Rs.setRecord(1, data, 0, data.length());

刪除記錄

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)

{

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 實現(xiàn) RecordFilter 接口,定義檢查記錄是否滿足應用程序定義的標準的過濾器。這個應用程序?qū)崿F(xiàn) RecordFilter 的 match() 方法來選擇 RecordEnumeration 返回的記錄。

清單 9. 過濾記錄

Public boolean matches(byte[] candidate)

{

String s1 = new String(candidate);

If (s1.equals("XX"))

Returns true;

Else

Returns false;

}

開發(fā)電話約會簿

在這部分,我們將通過構(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)

String appt = apptName " " apptTime;

byte bytes[] = appt.getBytes();

rs.addRecord(bytes,0,bytes.length);

同樣,這個應用程序以字節(jié)流形式檢索記錄,然后將它轉(zhuǎn)換成一個字符串。這個字符串以 ####AAAA 格式,其中 # 表示代表時間信息的數(shù)字,AAAA 表示代表約會描述的字符。這個應用程序解析這個字符串來獲得日期和時間信息,并以用戶所希望的格式顯示它們,比如 description - mm/dd/yyyy hh:mm AM_PM。

清單 11. 從記錄存儲檢索一條記錄

byte b[] = rs.getRecord(j);

String str = new String(b,0,b.length);

清單 12. 解析從記錄存儲獲得的數(shù)據(jù),然后以用戶所希望的格式顯示

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.

}

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

歡迎表單:歡迎表單顯示一個已經(jīng)設置好的約會列表,如果沒有設置約會,則通知用戶。它提供繼續(xù)或退出這個應用程序的各種選項。

菜單表單:菜單表單給用戶提供查看約會、設置新約會或取消約會等選項。

顯示表單:顯示表單顯示已經(jīng)設置好的約會列表。

設置表單:設置表單提供一個日期選擇域和一個輸入文本域,以提供新約會的詳細信息。當用戶選擇保存時,這條信息被存儲到數(shù)據(jù)庫中。

刪除表單:刪除表單列出一組約會,并提供選擇一個或多個的選項。如果用戶選擇刪除,所選擇的這組約會在記錄存儲中被標記為無效。

應用程序?qū)崿F(xiàn)使自己能夠響應各種事件的 CommandListener 和 ItemStateListener 接口。ItemStateListener 使應用程序能夠接收指示下面這些東西的內(nèi)部狀態(tài)的改變的事件:

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 包含這個樣本應用程序的完整清單。

總結(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教程/更新時間:2008-08-22
相關(guān)JSP教程