J2ME Personal Information Management (PIM) 概览

红薯 发布于 2010/08/22 09:02
阅读 318
收藏 1

简介: 根据 JSR 75 的定义,Personal Information Management (PIM) API 提供了一种访问移动设备上的本地个人数据的方法,这些数据包括 Contacts 数据、Tasks 数据和 Appointments 数据等等。在本文中,我们将仔细审视这个 API,讨论有关 PIM MIDlet 的开发、安全和部署问题,并比较 PIM 和另一个 J2ME API —— Record Management Store (RMS)。

移动环境中的 Personal Information Management (PIM)

随着新设备不断上市,在移动设备上提供 Address Book、Calendar 和 Task List 成为了一项必然的要求。J2ME 应用程序也需要访问这些数据。可选包 JSR 75 Personal Information Management (PIM) 提供了这个功能。

它不仅允许访问包含联系人、约会和任务的本地个人信息,还允许访问基于附加到设备上的 SIM 卡和 Local and Remote Personal Information 数据库的信息。

PIM 包支持从 vCard 和 vCalendar 导入和导出数据,vCard 和 vCalendar 分别是 Address Book 和 Calendar 的 Internet 标准格式。它还拥有阻止未授权类检索个人信息的安全特性。

另一个可选包 JSR 75 File Connection 提供一种访问本文探讨范围之外的本地文件系统的方法。

J2ME PIM 包

Java PIM 包通过 javax.microedition.pim 包表示。

这个包定义的重要接口包括:

  1. Contact —— 这个接口表示 Address Book 上的单个联系人。
  2. ContactList —— 这个接口表示 Address Book,这是一个 Contact 列表。
  3. Event —— 这个接口表示单个 Calendar Event。
  4. EventList —— 这个接口表示一个 Calendar 事件列表。
  5. ToDo —— 这个接口表示 Task List 中的单个 Task。
  6. ToDoList —— 这个接口表示 Task 列表。

这个包定义的主要类是:

PIM —— PIM 类定义一些方法,用于创建一个所有现有列表的索引,打开并编辑那些列表,将其作为来自 vCard 和 vCalendar(Contact 和 Calendar 的 Internet 标准)的导入或导出。

Contact 和 ContactList

一个 Contact 表示 Address Book 中的单个条目。Contact 中的主要字段是 Name、Address、Email、Birthday、Photo 和 Telephone。

为了确保跨平台可移植性,建议使用 Super Interface PIMList 提供的方法 isSupportedField()。

清单 1 展示如何向 Address Book 添加一个 Contact:


清单 1. 将 Contact 添加到 Address Book

				
ContactList addressBook = null;
try {
addressBook = (ContactList) PIM.getInstance().openPIMList(PIM.CONTACT_LIST,
PIM.READ_WRITE);
} catch (PIMException e) {
// Exit Application
}


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


The createContact() method creates a temporary empty Contact. A commit() call makes
the Contact data persistent. It is advisable to close the lists by invoking the close()
method after necessary operations have been performed.

try {
singleContact.commit();
} catch (PIMException e) {
// Exception occured
}

try {
// Other cleanup tasks
addressBook.close();
} catch (PIMException e) {

}

 

Event 和 Event List

一个 Event 表示 Event 数据库中的单个条目,比如,移动设备上的日历。Event 中的关键字段是 Location、Summary、Start date、End Date 和 Alarm notification。清单 2 展示如何向 Event 数据库添加一个 Event。


清单 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) {
// An error occured
}
try {
eventList.close();
} catch (PIMException e) {

}

 

ToDo 和 ToDo List

ToDo 接口表示移动设备上的 Task 数据库中的单个任务,重要的字段是 Note or Summary、Priority、Completion Date、Due Date 和 whether completed。清单 3 展示如何向数据库持久化添加一个 ToDo。


清单 3. 添加一个 Task

				
ToDoList tasks = null;
try {
tasks = (ToDoList) PIM.getInstance().openPIMList(PIM.TODO_LIST,
PIM.READ_WRITE);
} catch (PIMException e) {
// An error occurred
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) {
// An error occured
}
try {
tasks.close();
} catch (PIMException e) {

}

PIM 与 RMS 的区别

在继续讨论之前,我们先回顾一下 J2ME 提供的另一个关键功能,Record Management Store (RMS) 概念。RMS 允许 J2ME 应用程序持久地本地存储数据。RMS 包含以下组件:

Records —— 与每条记录拥有一个或多个字段的数据库系统不同,RMS 中的一条 Record 是一个单独的数据字段。它没有一个预先定义的数据类型或大小,可以包含任意数据。

RecordStore —— RecordStore 是一个 Records 集合,可以通过 J2ME 应用程序根据名称访问。

以下是 PIM 和 RMS 的区别,尽管二者都负责在设备上存储持久数据。

  1. PIM 向(从)Address Book、Calendar 和 Task List 等已定义的实体存储(和检索)数据。而另一方面,RMS 向(从)一个常规数据库存储(和检索)数据。PIM 中的单个实体是一个 Contact、Calendar 条目或一个 Task,而在 RMS 中,单个实体是一个字节数组。
  2. PIM 并不局限于本地设备,它可以访问一个附加 SIM 或另一个远程设备中的数据。RMS 只能访问本地设备中的数据。
  3. PIM 可以从 vCalendar 或 vContact 等外部源导入或导出,而 RMS 没有任何 Export 或 Import 功能。
  4. 与 RMS 相比,PIM 中的数据解释更加灵活。例如,一个 Contact(以标准格式定义)总是可以由另一个 J2ME 应用程序轻松解释。而 RMS 中的记录是字节数组,其他 J2ME 应用程序需要拥有关于如何解释它的信息。

一个示例 —— 添加一个联系人

在这个小节中,我们将讨论此前提到过的一个方法 addContact(),展示如何向 Address Book 添加一个联系人。当在表单中提交一个用户命令时,这个方法(见清单 4)将在一个单独的线程中调用。这个方法访问通过 UI Textfields 字段输入的数据。


清单 4. addContact() 方法

				
// 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) {
// An error occurred
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 要运行的移动设备时使用相同的方法。


图 1. PIM MIDlet Runtime API Selection
PIM MIDlet Runtime API Selection

MIDlet 需要其他权限才能读写 Contacts、Calendar 或 Task Lists,可以通过在 Wireless Toolkit 中单击 Settings 并选择 Permissions 来设置相关权限。这里提供了用于 ContactList、EventList 和 TodoList 的所有 Read 和 Write 权限。


图 2. PIM MIDlet 安全问题
PIM MIDlet 安全问题

结束语

在本文中,我们讨论了 J2ME 中的另一个重要功能 Personal Information Management (PIM),该功能允许访问移动设备上形式为 Contact、Task 和 Event 的本地数据。本文还比较了 PIM 和 RMS,后者是处理设备数据的另一个功能。现在,您可以通过 PIM 自带的导入和导出功能同步 J2ME 应用程序和 vCard 以及 vCalendar,后两者分别是 Contact 和 Calendar 的 Internet 标准格式。最后,我们介绍了运行时的安全和部署要求。

加载中
返回顶部
顶部