![]() |
|
|
在上文中,我们初浅的谈了谈 Waba的一些 GUI组件。基本所有有用的Palm OS程序都要有 GUI接口。同样,没有程序不使用数据。不论是编写商业应用程序还是游戏程序,你都需要某个存储数据的机制。
如果你打算使用 Java (或一种像 Java的语言)作为所选的语言,你就面临在 Palm OS上保证数据持久的挑战。 Palm OS是由 C应用程序接口构成,它能够提供给你许多程序设计能力,包括 DataManager和Palm数据库(pdb)文件 (在你提出反对意见之前让我先说--我知道 Palm没有文件系统,但是我仍然使用这个术语)。 Sun的 KVM版本带有用于创建 Palm上简单的接口的类,但是这些主要引用实现,不适用于商用应用程序。在这些类之中是 com.sun.kjava.Database,它提供一个程序员读/写 pdb文件的能力。可是,如果kjava Database类提供了访问 pdb应用程序接口的全部权限,它就不能移植到其他的不运行Palm OS的资源紧张的设备。Sun的意图是公开一个 PDA简表,在理论上支持Palm设备和 Windows CE设备。 这些与Waba的数据持久性有关系吗?如果你还能记得, Waba也是一种跨平台的解决方案,它的创建者不想提供一种只能用于 Palm的数据机制。象 kjava.Database类, Waba能读懂的持久数据只有字节数组。这虽然有些原始,但是 Waba提供给你一些 KVM没有的帮助。 创建一个Catalog并访问数据 Waba提供数据持久性,主要是通过 Catalog类。Catalog类扩展了 waba.io.Stream(一个基于流 I/O操作的抽象超类)。为了在Waba中创建一个Catalog,需要写下面这样的代码: Catalog c = new Catalog("MyCatalog.MYxx.DATA", Catalog.CREATE); 这个构造程序需要两个参数: catalog名和打开 Catalog的方式。(其他方式是 READ_ONLY、 WRITE_ONLY和 READ_WRITE ) Catalog名实际上是三个东西的级连而成,第一部分是适当的名称,如果你选择菜单,然后选择信息并且滚动浏览所有的你安装在设备上的应用程序,它会显现在 Palm设备上;第二部分是创建者标识号,它是一个四字节标识符,用于把 Palm OS和设备上的应用程序资源联系在一起,它必须有至少一个大写字母,并且必须是设备上唯一的,如果你打算发布的应用程序版本能被众人所至,你应该在 Palm OS站点上注册创建者标识号,这将确保没有其他人选用与你的应用程序相同的名称;第三部分是数据库类型。 一旦你打开 catalog,你就能访问它了。在你实际调用任何写方法之前,你必需通过 addRecord( int recordSize)方法添加一个记录,它将分配一个给定大小的新记录来写数据。 大部分应用程序开发人员习惯使用关系数据库,因为它能提供很多的方法来操作你的数据,但是这些方法小型设备都没有办法使用。换言之,一个 Catalog决不是一个关系数据库。 Catalog支持关键字段的概念,没有像 Catalog.findRecord("Wayne")这样返回记录 id的方法。只是连续的访问数据,为了找到一个特定的记录,你必需搜索整个记录集,寻找一个匹配项。有一个实用方法 inspectRecord(byte[] buf, int recPosition),设计来提供一种快速查看数据看是否是你想要的内容。应用程序接口文档警告说,当参数无效时使用这个方法可能不可靠。此外,你还必须避免超出 Catalog的底部。 Waba提供一些额外的帮助用于处理这样的原始持久性设备。它允许你把Catalog包装在一个 DataStream类中,这将使我们的负担减轻 (事实上,一个 DataStream可以包装任何其他面向流的类,比如 SerialPort ),见下代码: int j = 0; Catalog c = new Catalog("MyCatalog.MYxx.DATA", Catalog.CREATE); if (!c.isOpen()) return; DataStream ds = new DataStream(c); j = c.addRecord(6); ds.writeString("Fred"); j = c.addRecord(6); ds.writeString("Lucy"); ds.close(); c.close(); 我们打开这个 Catalog,然后在确保我们已经经过有效处理之后,创建 A新的 DataStream包装 Catalog实例。这之后,我们就可以添加记录了,然后调用 DataStream的 writeString方法把字符串转换成一个 Catalog可以接受的字节数组。 DataStream类中其他用于处理多种数据类型的方法包含 writeBoolean、 writeBytes、 writeFloat、 writeInt、 writeShort和 writeStringArray等。同样,也有与之匹配的读方法。有这些工具帮忙,我们就可以看另外一个从Catalog中读数据的例子。 c = new Catalog("MyCatalog.MYxx.DATA", Catalog.READ_ONLY); ds = new DataStream(c); if (!c.isOpen()) { edtEmail.setText("Not open!"); return; } else { count = c.getRecordCount(); } for (int i = 0; i < count; i++) { c.setRecordPos(i); edtNames.setText(edtNames.getText() + " " + ds.readString()); } ds.close(); c.close(); 我们打开 Catalog,现在使用 READ_ONLY方式,并把它包装在一个 DataStream中。在确定它被打开之后,我们使用 getRecordCount()方法获取记录数。当我们遍历这个记录集合时,获取每个姓名,再放入 Edit控件。注意我们使用 setRecordPos(record)方法定位每个记录的指针。这是遍历 Catalog的必要的步骤。然后,我们使用 DataStream,通过调用 readString()方法来获取数据。. 这说明了Waba中Catalog的基本的功能,不过,这些例子你在现实世界中编程时都不会见到,因为它们处理的都是非常简单的数据,前半篇文章中的联络管理器需要存储名、姓、地址电话、传真、电子邮件以及其他好几个字段。既然Catalog只能理解字节数组,那么我们如何确定一个字段在什么地方结束又在什么地方开始呢?可以使用 DataStream来示着一些变得更简单,如果你调用这个方法把数据写进 Catalog,那么把它取出也同样容易。例如,如果你象下面这样写数据: ds.writeString(edtFName.getText()); ds.writeString(edtLName.getText()); ds.writeString(edtPhone.getText()); ds.writeString(edtFax.getText()); 那么就要像下面这样把数据从Catalog取出 edtFName.setText(ds.readString()); edtLName.setText(ds.readString()); edtPhone.setText(ds.readString()); edtFax.setText(ds.readString()); 只要保持适当的顺序,数据将通过 DataStream类适当地分隔。在什么位置分隔数据完全由你决定,也可以通过相对位置或使用某些字符分隔,这是一个胜过 kjava.Database类的地方。 到本文为止,我的六篇关于Java嵌入式开发的文章就全部写完了,终于可以松一口气,看看窗外美丽的风光了,可是比起Java和嵌入式开发的世界,这些又算什么呢?在以后的文章中我还会继续谈谈其他的开发嵌入设备应用程序的语言和数据库系统,请大家等待。
上一篇:持久数据和记录管理系统详解 下一篇:使用Waba开发Palm程序
|