如果你刚刚加入我们的行列,你可能希望查看我们早先的几篇文章:
探索J2ME:构建开销追踪系统
探索J2ME:创建开销细节表单
探索J2ME世界:使用记录管理系统
上次,我们通过RecordStore类完成了ExpensesApp应用程序的开销项目的存储功能。RecordStore类提供了对J2ME记录库的基本的访问功能。然而,lsMain显示的开销项目按照输入顺序排列产生了一个小问题,即查询某一个项目比较麻烦。
在本文中,我将介绍RMS的记录排序API——特别是RecordEnumeration类和 RecordComparator接口,你可以在javax.microedition.rms软件包中找到这两者。我同时还要顺便谈谈RecordFilter接口,它可以让你在记录库中查找某个特殊的记录。你可以在这儿下载最新版本ExpensesApp的代码。
在代码清单 A中,你会发现ExpenseInfo.LoadExpenses又一次被修改了,这次利用RecordEnumeration对象来按照记录所保存的某项数据,而不是记录插入的顺序,来从记录库中查找记录:
RecordEnumeration enu = rs.enumarateRecords(null, new
ExpenseComparator, false);
RecordStore.enumerateRecords接受一个ExpenseComparator类的对象(为参数),ExpenseComparator类实现了RecordComparator的接口,RecordEnumeration用它来确定用来排序的记录的顺序。我在清单B中给出了ExpenseComparator的代码。
让我们来检测一下RecordComparator.compare方法。Compare方法用于处理两个记录,这两个记录均处于字节数组的形式(参数为bytes和bytes1数组),并且必须可以从中提取出任何可以决定先后次序的数据(决定先后次序的方式由RecordEnumeration确定)。该方法然后这样指出这两个记录的相对关系::
在ExpenseComparator中,我从这两个记录中获取ExpenseDate字段(它以“当前时刻的毫秒数”的格式被存到记录库中)并根据这两个记录的排序返回相应的值。
实现RecordComparator时,要记住对记录库中的每一个记录至少要调用一次compare方法,(当枚举开始产生时)。所以,你需要正确引导比较过程,使得这所费时间尽量的短,以免没有必要地降低应用程序的运行速度。还有一点就是,你用于比较的两个记录在最后无需紧联(immediately adjacent),分类枚举。