隨著新設備不斷上市,在移動設備上提供通訊錄、行事曆和待辦事項清單成為了一項必然的需求。J2ME 應用程式也需要存取這些資料。可選套件 JSR 75 Personal Information Management (PIM) 提供了這個功能。
它不僅允許存取包含聯絡人、約會和任務的本地個人資訊,還允許存取基於附加到設備上的 SIM 卡和本地及遠端個人資訊資料庫的資訊。
PIM 套件支援從 vCard 和 vCalendar 匯入和匯出資料,vCard 和 vCalendar 分別是通訊錄和行事曆的網際網路標準格式。它還擁有阻止未授權類別檢索個人資訊的安全特性。
另一個可選套件 JSR 75 File Connection 提供一種存取本文探討範圍之外的本地檔案系統的方法。
Java PIM 套件透過 javax.microedition.pim 套件表示。
這個套件定義的重要介面包括:
這個套件定義的主要類別是:
一個 Contact 表示通訊錄中的單個條目。Contact 中的主要欄位是 Name、Address、Email、Birthday、Photo 和 Telephone。
為了確保跨平台可移植性,建議使用超級介面 PIMList 提供的方法 isSupportedField()。
程式碼片段 1 展示如何向通訊錄新增一個 Contact:
ContactList addressBook = null;
try {
addressBook = (ContactList) PIM.getInstance().openPIMList(PIM.CONTACT_LIST, PIM.READ_WRITE);
} catch (PIMException e) {
// 結束應用程式
}
Contact singleContact = addressBook.createContact();
String[] name = new String[addressBook.stringArraySize(Contact.NAME)];
if (addressBook.isSupportedField(Contact.NAME_FORMATTED))
singleContact.addString(Contact.NAME_FORMATTED, PIMItem.ATTR_NONE, "Mrs. Jane Doe");
// createContact() 方法建立一個暫時的空 Contact。呼叫 commit() 使 Contact 資料持久化。
// 建議在執行必要操作後呼叫 close() 方法關閉列表。
try {
singleContact.commit();
} catch (PIMException e) {
// 發生例外
}
try {
// 其他清理工作
addressBook.close();
} catch (PIMException e) {
}
一個 Event 表示事件資料庫中的單個條目,比如移動設備上的行事曆。Event 中的關鍵欄位是 Location、Summary、Start date、End Date 和 Alarm notification。程式碼片段 2 展示如何向事件資料庫新增一個 Event。
EventList eventList = null;
try {
eventList = (EventList) PIM.getInstance().openPIMList(PIM.EVENT_LIST, PIM.READ_WRITE);
} catch (PIMException e) {
return;
}
Event singleEvent = eventList.createEvent();
if (eventList.isSupportedField(Event.SUMMARY))
singleEvent.addString(Event.SUMMARY, PIMItem.ATTR_NONE, "Java Training");
if (eventList.isSupportedField(Event.START))
singleEvent.addDate(Event.START, PIMItem.ATTR_NONE, aDate.getTime());
if (eventList.isSupportedField(Event.END))
singleEvent.addDate(Event.END, PIMItem.ATTR_NONE, aDate.getTime());
try {
singleEvent.commit();
} catch (PIMException e) {
// 發生錯誤
}
try {
eventList.close();
} catch (PIMException e) {
}
ToDo 介面表示移動設備上的任務資料庫中的單個任務,重要的欄位是 Note or Summary、Priority、Completion Date、Due Date 和 whether completed。程式碼片段 3 展示如何向資料庫持久化新增一個 ToDo。
ToDoList tasks = null;
try {
tasks = (ToDoList) PIM.getInstance().openPIMList(PIM.TODO_LIST, PIM.READ_WRITE);
} catch (PIMException e) {
// 發生錯誤
return;
}
ToDo singleTask = tasks.createToDo();
if (tasks.isSupportedField(Event.SUMMARY))
singleTask.addString(ToDo.SUMMARY, PIMItem.ATTR_NONE, "Shopping for Halloween");
if (tasks.isSupportedField(Event.DUE))
singleTask.addDate(ToDo.DUE, PIMItem.ATTR_NONE, new Date().getTime());
try {
singleTask.commit();
} catch (PIMException e) {
// 發生錯誤
}
try {
tasks.close();
} catch (PIMException e) {
}
在繼續討論之前,我們先回顧一下 J2ME 提供的另一個關鍵功能,Record Management Store (RMS) 概念。RMS 允許 J2ME 應用程式持久地本地儲存資料。RMS 包含以下元件:
以下是 PIM 和 RMS 的差異,雖然二者都負責在設備上儲存持久資料。
在這個小節中,我們將討論此前提到過的一個方法 addContact(),展示如何向通訊錄新增一個聯絡人。當在表單中提交一個使用者命令時,這個方法 (見程式碼片段 4) 將在一個單獨的執行緒中呼叫。這個方法存取透過 UI Textfields 欄位輸入的資料。
// Import
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.pim.*;
// Text input
TextField nameField;
TextField phoneField;
...
public void addContact() {
ContactList contacts = null;
try {
contacts = (ContactList) PIM.getInstance().openPIMList(PIM.CONTACT_LIST, PIM.READ_WRITE);
} catch (PIMException e) {
// 發生錯誤
e.printStackTrace();
}
Contact contact = contacts.createContact();
String[] name = new String[contacts.stringArraySize(Contact.NAME)];
if (contacts.isSupportedArrayElement(Contact.NAME, Contact.NAME_GIVEN))
name[Contact.NAME_GIVEN] = nameField.getString();
if (contacts.isSupportedField(Contact.TEL))
contact.addString(Contact.TEL, Contact.ATTR_HOME, phoneField.toString());
try {
contact.commit();
} catch (Exception e) {}
}
PIM MIDlet 應該在一個支援 PIM 的配置 (即 JSR 75) 中執行。我們透過在 Sun 的 Wireless Toolkit 2.5 上先點選 Settings 然後點選 API Selection 來選擇以下設定。選擇 PIM MIDlet 要執行的移動設備時使用相同的方法。

MIDlet 需要其他權限才能讀寫 Contacts、Calendar 或 Task Lists,可以透過在 Wireless Toolkit 中點選 Settings 並選擇 Permissions 來設定相關權限。這裡提供了用於 ContactList、EventList 和 TodoList 的所有 Read 和 Write 權限。

在本文中,我們討論了 J2ME 中的另一個重要功能 Personal Information Management (PIM),該功能允許存取移動設備上形式為 Contact、Task 和 Event 的本地資料。本文還比較了 PIM 和 RMS,後者是處理設備資料的另一個功能。現在,您可以透過 PIM 自帶的匯入和匯出功能同步 J2ME 應用程式和 vCard 以及 vCalendar,後兩者分別是 Contact 和 Calendar 的網際網路標準格式。最後,我們介紹了執行期的安全和部署需求。