Board logo

标题: Java嵌入式开发Palm OS程序之一 04 [打印本页]

作者: samwalton    时间: 2014-3-25 17:14     标题: Java嵌入式开发Palm OS程序之一 04

注意,我们还有一个单独的类 Contacts.java的一些接口,应当放置在第一个选项卡内,设置选项卡接口是相当简单地。我们声明一个 TabPanel,并设置它的边界,初始化 Contacts对象并设置它的边界,然后把 Contacts对象添加到TabPanel中,最后,我们把 TabPanel添加到主窗口中。

  另外一个差别就是事件处理代码,我们需要使用 getaActiveTab()方法确定我们要处理哪一个选项卡。在此之后,我们可以继续进行处理,添加一个 contact或 prospect。
 第二节 Waba的数据持久化

  在上文中,我们初浅的谈了谈 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()方法来获取数据。.




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0