你可以从这儿下载最新版本的ExpensesApp应用程序的代码。在写本文时,我起初只想修改ExpenseInfo类,但是RecordStore类是由一种古怪(quirky)的方法实现的,这使得这么做会难以置信得复杂。(在别的地方需要好几个try嵌套语句)。结果,我对Expenses和DetailForm类也做了修改,从而简化了整个过程。
事实上,绝大多数RMS(记录管理系统)都有类似的怪癖(quirk),把这些怪癖弄到一块会阻碍你的开发进度。下面是一些我曾遇到的问题:不同的类中的功能类似的方法应该有同样或者近似的名字,可是在RMS中不是这样;一些方法的名字“名不副实”,会误导你错误认识该方法的功能;还有一些方法会在编程者无法处理的情况下抛出例外。你会发现,如果你经常使用J2ME类,拥有一份MIDP的Java文档,或者至少一个有方法提示(method prompting)功能的编辑器是特别值得的。
看看代码清单A,你会发现静态方法ExpenseInfo.LoadExpenses为了从RecordStore对象中读取数据而被修改了。当打开或者创建一个记录库后,我会遍历库中所有的记录,把每个记录中的数据提取到一个字节数组中,然后为每一个记录创建一个新的ExpenseItem实例,并用一个Vector返回整套条目。ExpenseInfo.LoadExpenses现在抛出RecordStoreException例外,closeRecordStore本身也会抛出例外,因此改变(代码)是不可避免的了,这样,Expenses类的构造函数也需要加上一个try语句。
我还用RMS的API来更新了ExpenseInfo.save和 ExpenseInfo.delete方法。你可以在代码清单B中找到它们。这两个方法通过检查非零记录ID(私有ExpenseID变量)来检测记录是否存在于当前实例中。如果通过方法save来保存一个新的开销记录,就会调用addRecord方法来把该记录添加到记录库中。如果记录已经存在,save方法就调用setRecord方法来更新对应的记录。Delete方法工作过程与之类似,如果它的实例没有记录ID号就什么也不做(因为它还没有被保存),如果记录ID号(ExpenseID)非零,则调用deleteRecord方法来删除对应记录。
我们已经让ExpensesApp应用程序前进了一大步,但是尚未全部完成。现在它还存在下列问题:
请你考虑这个练习。首先,去掉Expense类的构造函数中的注释符,这样就恢复了先前被注释掉的删除函数。然后运行ExpensesApp应用程序,并添加若干个新的开销项目。接着,删除你刚才输入的第二个开销项目,并关闭ExpensesApp。当你再次进入ExpensesApp就会捕获到一个例外情况。想想这是为什么。
在下一篇探索J2ME文章中,我将向你展示如何用RecordEnumeration类来解决上述两个问题。祝你好运。
欢迎评论或投稿
用户评论