移动环境中的 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包表示。
这个包定义的重要接口包括:
- Contact——这个接口表示Address Book上的单个联系人。
- ContactList——这个接口表示Address Book,这是一个Contact列表。
- Event——这个接口表示单个Calendar Event。
- EventList——这个接口表示一个Calendar事件列表。
- ToDo——这个接口表示Task List中的单个Task。
- 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的区别,尽管二者都负责在设备上存储持久数据。
PIM向(从)Address Book、Calendar和Task List等已定义的实体存储(和检索)数据。而另一方面,RMS向(从)一个常规数据库存储(和检索)数据。PIM中的单个实体是一个Contact、Calendar条目或一个Task,而在RMS中,单个实体是一个字节数组。
PIM并不局限于本地设备,它可以访问一个附加SIM或另一个远程设备中的数据。RMS只能访问本地设备中的数据。PIM可以从vCalendar或vContact等外部源导入或导出,而RMS没有任何Export或Import功能。与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
MIDlet需要其他权限才能读写Contacts、Calendar或Task Lists,可以通过在Wireless Toolkit中单击Settings并选择Permissions来设置相关权限。这里提供了用ContactList、EventList和TodoList的所有Read和Write权限。
图 2. PIM MIDlet 安全问题
结束语
在本文中,我们讨论了J2ME中的另一个重要功能Personal Information Management(PIM),该功能允许访问移动设备上形式为Contact、Task和Event的本地数据。本文还比较了PIM和RMS,后者是处理设备数据的另一个功能。现在,您可以通过PIM自带的导入和导出功能同步J2ME应用程序和vCard以及vCalendar,后两者分别是Contact和Calendar的Internet标准格式。最后,我们介绍了运行时的安全和部署要求。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
详解基于J2ME平台下SOAP协议的应用
目前企业应用正在向面向Web服务的SOA架构转变,嵌入式系统与企业应用系统的连接目前还处于TCP/IP协议、HTTP协议等比较初级的阶段。
-
企业如何用好中间件(二)
CBSD的主要优点之一是重用,它的目标是代码、设计、解决方案都能重用。而设计模式是设计经验的记录,利用它可以达到事半功倍的效果。目前己有几十种设计模式可供参考……