探索J2ME:使用记录管理系统

开发者在线 Builder.com.cn 更新时间:2002-10-14作者:BUILDER.COM 来源:

深入代码

你可以从这儿下载最新版本的ExpensesApp应用程序的代码。在写本文时,我起初只想修改ExpenseInfo类,但是RecordStore类是由一种古怪(quirky)的方法实现的,这使得这么做会难以置信得复杂。(在别的地方需要好几个try嵌套语句)。结果,我对ExpensesDetailForm类也做了修改,从而简化了整个过程。

事实上,绝大多数RMS(记录管理系统)都有类似的怪癖(quirk),把这些怪癖弄到一块会阻碍你的开发进度。下面是一些我曾遇到的问题:不同的类中的功能类似的方法应该有同样或者近似的名字,可是在RMS中不是这样;一些方法的名字“名不副实”,会误导你错误认识该方法的功能;还有一些方法会在编程者无法处理的情况下抛出例外。你会发现,如果你经常使用J2ME类,拥有一份MIDP的Java文档,或者至少一个有方法提示(method prompting)功能的编辑器是特别值得的。

看看代码清单A,你会发现静态方法ExpenseInfo.LoadExpenses为了从RecordStore对象中读取数据而被修改了。当打开或者创建一个记录库后,我会遍历库中所有的记录,把每个记录中的数据提取到一个字节数组中,然后为每一个记录创建一个新的ExpenseItem实例,并用一个Vector返回整套条目。ExpenseInfo.LoadExpenses现在抛出RecordStoreException例外,closeRecordStore本身也会抛出例外,因此改变(代码)是不可避免的了,这样,Expenses类的构造函数也需要加上一个try语句。

我还用RMS的API来更新了ExpenseInfo.saveExpenseInfo.delete方法。你可以在代码清单B中找到它们。这两个方法通过检查非零记录ID(私有ExpenseID变量)来检测记录是否存在于当前实例中。如果通过方法save来保存一个新的开销记录,就会调用addRecord方法来把该记录添加到记录库中。如果记录已经存在,save方法就调用setRecord方法来更新对应的记录。Delete方法工作过程与之类似,如果它的实例没有记录ID号就什么也不做(因为它还没有被保存),如果记录ID号(ExpenseID)非零,则调用deleteRecord方法来删除对应记录。

还有进一步的工作需要完成

我们已经让ExpensesApp应用程序前进了一大步,但是尚未全部完成。现在它还存在下列问题:

  • 删除函数还有错误(bug):在记录库文件的中部将会引发LoadExpenses,并抛出InvalidRecordIDException例外。因此,lsMain中的cmDelete命令不可靠。
  • 目前,开销条目按输入是到lsMain的顺序来显示的。如果按存储其中的数据来排序显示这些条目会比较有用。
你能发现这些bug吗?

请你考虑这个练习。首先,去掉Expense类的构造函数中的注释符,这样就恢复了先前被注释掉的删除函数。然后运行ExpensesApp应用程序,并添加若干个新的开销项目。接着,删除你刚才输入的第二个开销项目,并关闭ExpensesApp。当你再次进入ExpensesApp就会捕获到一个例外情况。想想这是为什么。

在下一篇探索J2ME文章中,我将向你展示如何用RecordEnumeration类来解决上述两个问题。祝你好运。



本文为ZDNet China版权所有,未经许可严禁转载。

责任编辑:炒饭

欢迎评论或投稿

用户评论

  • 用户名
  • 评论内容